вызов веб-службы wcf с использованием basichttpbinding без REST или JSON - PullRequest
2 голосов
/ 16 июля 2011

У меня есть веб-служба wcf, доступная через wsHTTPBinding и basicHTTPBinding. Последний указывает адрес конечной точки как "/ basic", как показано ниже:

    <endpoint address="/basic" binding="basicHttpBinding" bindingConfiguration="theAwesomeBasicHttpServerBinding" contract="LOServices.Proxy.ServiceContracts.ILOService">
      <identity>
        <servicePrincipalName value="HTTP/MY_MACHINE_NAME" />
      </identity>
    </endpoint>

привязка определяется следующим образом:

  <basicHttpBinding>
    <binding name="theAwesomeBasicHttpServerBinding" maxReceivedMessageSize="5000000">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>

Я пытаюсь вызвать один из веб-методов с помощью jquery. Потому что это более простой HTTBBinding, а не RESTful, поэтому я не буду использовать JSON. Следовательно, я строю XML-запрос из предыдущего (успешного) вызова, который я сделал службе через тестового клиента wcf:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/ILOService/GetLoanActions</Action>
  </s:Header>
  <s:Body>
    <GetLoanActions xmlns="http://tempuri.org/">
      <request xmlns:d4p1="http://schemas.datacontract.org/2004/07/LOServices.Proxy.Requests" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <d4p1:AssociationNumber>3</d4p1:AssociationNumber>
        <d4p1:IgnoreWarnings>false</d4p1:IgnoreWarnings>
      </request>
    </GetLoanActions>
  </s:Body>
</s:Envelope>

Фактический JavaScript, который я использую, поэтому структурирован следующим образом:

        function callWs() {
            var theRequest = " \
<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"> \
  <s:Header> \
    <Action s:mustUnderstand=\"1\" xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">http://tempuri.org/ILOService/GetLoanActions</Action> \
  </s:Header> \
  <s:Body> \
    <GetLoanActions xmlns=\"http://tempuri.org/\"> \
      <request xmlns:d4p1=\"http://schemas.datacontract.org/2004/07/LOServices.Proxy.Requests\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"> \
        <d4p1:AssociationNumber>3</d4p1:AssociationNumber> \
        <d4p1:IgnoreWarnings>false</d4p1:IgnoreWarnings> \
      </request> \
    </GetLoanActions> \
  </s:Body> \
</s:Envelope>";

            $.ajax({
                type: "POST",
                url: "http://localhost/LOServices/Services/LOService.svc/basic",
                data: theRequest,
                timeout: 10000,
                contentType: "text/xml",
                dataType: "xml",
                async: false
            });
        }

Мне не повезло получать "плохой запрос" от службы wcf, когда я запускаю его таким образом, и это не оставляет мне много возможностей для продолжения.

Я изо всех сил пытался сделать эту работу по крайней мере 3 часа, поэтому, если у кого-то есть идеи, пожалуйста, не стесняйтесь высказывать некоторые предложения.

Спасибо.

1 Ответ

4 голосов
/ 16 июля 2011

Для запросов BasicHttpBinding вам необходимо установить заголовок SOAPAction в HTTP-запросе (который определит, какая операция должна получать сообщение).

$.ajax({
      type: "POST",
      url: "http://localhost/LOServices/Services/LOService.svc/basic",
      data: theRequest,
      timeout: 10000,
      contentType: "text/xml",
      dataType: "xml",
      async: false,
      headers: { "SOAPAction": "http://tempuri.org/Contract/Operation" }
    });

Обратите внимание, что опция headers является новой в jQuery1.5, поэтому, если вы используете более старую версию, вам нужно использовать для этого функцию beforeSend.

Кроме того, в будущем вы сможете получить больше информации о таких ошибках, как "«Неверный запрос» или «Внутренняя ошибка сервера» от , включающая трассировку для WCF - трассировка будет содержать более подробную информацию о проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...