0

我们有一个与 iPhone 应用程序对话的 .NET WCF 服务。我正在使用 wsdl2objc 生成所有 SOAP 魔术所需的 objc 代码。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 错误。任何帮助深表感谢!

谢谢,
泰加。

4

3 回答 3

1

我有一个类似的问题,通过更改 wsdl2objc 输出中的信封架构 URL 已解决

我改变了这个

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");

它似乎修复了我从 iOS 调用的 WCF Web 服务。

我认为这意味着当 WCF 服务器似乎需要 SOAP 1.2 时,我的 wsdl2objc 版本正在输出 SOAP 1.1 信封

有没有其他人注意到这一点?是否有另一种方法来配置它而不是在生成代码后进行更改?

于 2013-08-01T02:30:17.877 回答
0

看来我缺少导致此问题的操作值周围的开始引用和结束引用标记。这是对我有用的代码,但我不喜欢将 设置action为 httpcontent-type标头的一部分。因此,如果有人能提出更好的解决方案,我很乐意给予赞扬:

NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8; action=\"%@\"", soapAction];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
于 2012-03-27T19:04:13.203 回答
0

在我使用过的 WCF 服务中,我只是在标头中传递了值"text/xml"Content-Type然后在单独的SOAPAction标头中传递了正确的肥皂操作值(类似于 wsdl2objc 的做法)。

这里有几件事要检查:

  1. 您的 WCF 服务是使用 basicHttpBinding - 还是其他东西。(我似乎记得读过除 basicHttpBinding 以外的绑定在 iOS 上不能很好地(或根本不能)工作——但我不确定)
  2. 此服务的正确 SOAP 操作值是多少?在我使用的服务中,它是使用<ServiceNamespace>\<WCFInterfaceName>\<MethodName>
于 2012-03-28T13:24:14.280 回答