Прокси-класс SoapHttpClientProtocol выдает исключение нулевой ссылки без заголовков адресации - PullRequest
0 голосов
/ 18 марта 2020

Я сгенерировал прокси-класс 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-адрес без адресации заголовков?

...