0

iPhone アプリと通信する .NET WCF サービスがあります。すべての SOAP マジックに必要な objc コードを生成するために wsdl2objc を使用しています。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:EnvelopeSoapUI で同じものを使用すると、リクエストは正しく機能します。私が見る限り、2 つのリクエストの唯一の違いは、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

使用したWCFサービス"text/xml"では、ヘッダーに値をContent-Type渡してから、別のヘッダーに正しいsoapアクション値を渡しましたSOAPAction(wsdl2objcが行っていた方法と同様です)。

確認すべき点がいくつかあります。

  1. あなたのWCFサービスはbasicHttpBindingを使用していますか-または何か他のものです。(basicHttpBinding以外のバインディングはiOSではうまく機能しない(またはまったく機能しない)ことを読んだことを覚えているようですが、確かではありません)
  2. このサービスの正しいSOAPアクション値は何ですか?私が使用するサービスでは、<ServiceNamespace>\<WCFInterfaceName>\<MethodName>
于 2012-03-28T13:24:14.280 に答える
0

これを引き起こしたアクション値の前後に開始引用符と終了引用符が欠けていたようです。これは私のために働いたコードですが、httpヘッダーactionの一部として設定することに満足していません. content-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 に答える