wsdl2objc:EndpointDispatcher上的ContractFilter不匹配

时间:2012-03-27 17:28:10

标签: ios soap wsdl2objc

我们有一个.NET WCF服务与iPhone应用程序交谈。我正在使用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>

但是,如果我在SoapUI中使用相同的s:Envelope,则请求可以正常工作。据我所知,这两个请求之间的唯一区别是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错误。非常感谢任何帮助!

谢谢,
的Teja。

3 个答案:

答案 0 :(得分: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信封

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

答案 1 :(得分:0)

似乎我错过了引发此操作的动作值周围的引号和结束引号标签。这是适用于我的代码,但我不满意将action设置为http content-type标头的一部分。因此,如果有人能提出更好的解决方案,我很乐意给予信任:

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

答案 2 :(得分:0)

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

以下是需要检查的几件事:

  1. 您的WCF服务是否使用basicHttpBinding - 或其他。 (我似乎记得读过除了basicHttpBinding之外的绑定在iOS上运行不好(或根本没有) - 但我不确定)
  2. 此服务的正确SOAP操作值是多少?在使用<ServiceNamespace>\<WCFInterfaceName>\<MethodName>
  3. 构建的服务中