Я сгенерировал прокси-класс wsdl с помощью wsdl.exe. Мне нужны были заголовки безопасности wsse, поэтому я следовал этому { ссылка }, который дал мне заголовок Security правильно. Поэтому я сделал следующие изменения в сгенерированном классе:
//public partial class calltemplatesService : System.Web.Services.Protocols.SoapHttpClientProtocol {
public partial class calltemplatesService : Microsoft.Web.Services2.WebServicesClientProtocol {
Когда я сейчас запускаю вызов, он вызывает конечную точку (я заметил это с помощью Fiddler). Теперь конечная точка (по какой-то причине. Она является устаревшей и не подлежит изменению.) Не любит заголовок Addressing и отвечает Requested API not found in the system
. Я протестировал его в SoapUI, и вызов работает, только если я удаляю все из следующих заголовков: Action, MessageID, ReplyTo и To.
<soap:Header>
<!-- REMOVE FROM HERE -->
<wsa:Action>http://example.com/services/?soap:calltemplates:v1#getTemplate</wsa:Action>
<wsa:MessageID>uuid:142da07f-eed3-4fe3-a540-7bba8e13b500</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://example.com/services/?soap:calltemplates:v1</wsa:To>
<!-- REMOVE UNTIL HERE -->
<wsse:Security soap:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-5cd87795-9fe1-4e3f-a2e2-4e1ac4462f86">
<wsu:Created>2020-03-18T06:10:30Z</wsu:Created>
<wsu:Expires>2020-03-18T06:15:30Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken wsu:Id="SecurityToken-6cf98720-4700-4bc5-bae5-7ffe06d2c669">
<wsse:Username>username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
<wsse:Nonce>nonce</wsse:Nonce>
<wsu:Created>2020-03-18T06:10:30Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
Я могу удалить эти заголовки в своем коде например:
var srv = new calltemplatesService();
UsernameToken token = new UsernameToken("username", "password", PasswordOption.SendPlainText);
// This adds the Security header
srv.RequestSoapContext.Security.Tokens.Add(token);
// This removes the Addressing headers
srv.RequestSoapContext.Addressing.Clear();
var tmpl = srv.getTemplate("0000000050", true, new string[] { });
После удаления этих заголовков вызов завершается с ошибкой NullReferenceException внутри класса WebServicesClientProtocol. Вот трассировка стека:
Message:
Test method UnitTestProject1.UnitTest1.TestMethod1 threw exception:
System.NullReferenceException: Object reference not set to an instance of an object.
Stack Trace:
WebServicesClientProtocol.GetWebRequest(Uri uri)
SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
calltemplatesService.getTemplate(String templateId, Boolean fromBackend, String[] templateConfig) line 312
FullCreator.Call() line 43
UnitTest1.TestMethod1() line 14
Прокси-класс имеет URL в конструкторе:
public calltemplatesService() {
this.Url = "http://example.com/services/?soap:calltemplates:v1";
}
Я думаю, что он использует заголовки адресации для вызова? Что мне нужно сделать, чтобы он вызывал правильный URL-адрес без адресации заголовков?