wsdl2objc: несоответствие ContractFilter в EndpointDispatcher - PullRequest
0 голосов
/ 27 марта 2012

У нас есть служба .NET WCF, которая общается с приложением для iPhone.Я использую wsdl2objc для генерации кода objc, необходимого для всей магии SOAP.SoapUI может добавить wsdl этого сервиса и правильно отправлять запросы.Но запрос, сгенерированный wsdl2objc, жалуется на это:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Body>
        <s:Fault>
            <s:Code>
                <s:Value>s:Sender</s:Value>
                <s:Subcode>
                    <s:Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</s:Value>
                </s:Subcode>
            </s:Code>
            <s:Reason>
                <s:Text xml:lang="en-US">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
                </s:Text>
            </s:Reason>
        </s:Fault>
    </s:Body>
</s:Envelope>

Однако, если я использую тот же s:Envelope с SoapUI, запрос будет работать правильно.Насколько я вижу, единственная разница между этими двумя запросами заключается в разделе заголовка, где wsdl2objc генерирует это:

SOAPAction:http://xx/AuthenticateDevice

, но soapUI генерирует:

Content-Type: application/soap+xml;charset=UTF-8;action="http://xx/AuthenticateDevice"

Я попытался изменить код, сгенерированный wsdl2objc, и заменил это:

[request setValue:soapAction forHTTPHeaderField:@"SOAPAction"];
NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8;"];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

на это:

[request setValue:soapAction forHTTPHeaderField:@"action"];
NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8;"];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

Но я сейчас получаю ошибку 400.Любая помощь очень ценится!

Спасибо,
Теджа.

Ответы [ 3 ]

1 голос
/ 01 августа 2013

У меня была похожая проблема, которая была исправлена ​​путем изменения URL-адреса схемы конверта в выводе wsdl2objc

Я изменил это

xmlNsPtr soapEnvelopeNs = xmlNewNs(root, (const      xmlChar*)"http://www.w3.org/2003/05/soap-envelope", (const xmlChar*)"soap");

на Это:

xmlNsPtr soapEnvelopeNs = xmlNewNs(root, (const xmlChar*)"http://schemas.xmlsoap.org/soap/envelope/", (const xmlChar*)"soap");

и это, похоже, исправило мои звонки на веб-сервис WCF с iOS.

Я думаю, это означает, что моя версия wsdl2objc выводит конверт SOAP 1.1, когда серверу WCF, кажется, требуется SOAP 1.2

Кто-нибудь еще заметил это?Есть ли другой способ настроить это, а не изменить после генерации кода?

0 голосов
/ 28 марта 2012

В службах WCF, с которыми я работал, я только что передал значение "text/xml" в заголовок Content-Type, а затем передал правильное значение действия мыла в отдельном заголовке SOAPAction (аналогично тому, как wsdl2objc был делает это).

Вот пара вещей, которые нужно проверить:

  1. Ваша служба WCF использует basicHttpBinding или что-то еще. (Кажется, я помню, что читал, что привязки, кроме basicHttpBinding, не работают (или вообще) с iOS - но я не уверен)
  2. Какое правильное значение действия SOAP для этой службы? В сервисах, с которыми я работаю, он построен с использованием <ServiceNamespace>\<WCFInterfaceName>\<MethodName>
0 голосов
/ 27 марта 2012

Похоже, что мне не хватало тегов начала и конца цитаты вокруг значения действия, которое вызывало это. Вот код, который работал для меня, но я не доволен установкой action как части заголовка http content-type. Поэтому, если кто-то сможет найти лучшее решение, я с радостью сообщу:

NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8; action=\"%@\"", soapAction];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...