1

I am working on understanding how SOAP services work.My client is in Java and the service is using WCF (although in theory this shouldn't matter). If I am given an example of a SOAP envelope and do the following:

-Build a SOAP envelope that exactly follows the example
-Use an HttpPost object to post the data to www.service.com/service.svc

Is this a correct (although improper) way to call the service? Because when I do this, I receive a 400 response, even though my SOAP envelope is the exact same as the example.

4

2 に答える 2

0

それはうまくいくはずです。必要なヘッダーがいくつか欠落している可能性があります。TCP モニターを使用し、作業中のリクエストをインターセプトし、その内容を分析することをお勧めします。

于 2013-04-28T04:11:41.500 に答える
0

HTTP 400 (Bad Request) を取得している理由は、サービスがBasicHttpBindingSOAP 1.1 を使用しており、SOAP 1.2 メッセージを送信している可能性が高いためだと思います (SOAP 1.2 を使用していることをコメントで示したように)。メッセージのフォーマットは両者で異なります。

最も簡単な解決策は SOAP 1.1 を使用することですが、SOAP 1.2 を使用する必要がある (または使用したい) 場合は、次の方法が役立ちます。

構成ファイルでは、エンドポイントまたはバインドを定義していません。WCF は 4.0 以降で既定値を使用するため、これで問題ありません。

ただし、HTTP のデフォルトのバインディングはBasicHttpBinding. SOAP 1.2 をサポートするバインディングを使用する (またはメッセージを SOAP 1.1 に変更する) 必要があります。WSHttpBindingSOAP 1.2 をサポートする を使用できますが、セキュリティ設定を変更する必要があります (デフォルトでは Windows です)。

もう 1 つのオプションは、SOAP1.1 を実装するカスタム バインディングを使用することです。

いくつかの例を挙げます (私は WCF サービス用の .NET 以外のクライアントを作成したことがないため、確実に機能するとは言えませんが、少なくとも正しい方向に進むはずです。

WSHttpBinding

設定ファイルのプロトコル マッピングをオーバーライドして、BasicHttpBindingHTTPリクエストのデフォルトのプロトコル マッピングを から に変更します。WsHttpBinding

<protocolMapping>
  <addBinding protocol="wsHttpBinding" scheme="http" />
</protocolMapping>

構成ファイルにバインディング セクションを追加して、セキュリティ モードを [なし] に設定できるようにします。これは次の<system.serviceModel>セクションにあります。

<bindings>
  <wsHttpBinding>
    <binding>
        <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

nameバインディングの属性に値を設定していないことに注意してください。これにより、バインディング定義がデフォルトとして設定され、HTTP のデフォルト プロトコルを に変更することと合わせて、wsHttpBindingSOAP 1.2 を送信できるようになります。

セキュリティに関する注意* SOAP をよりよく理解しようとしているだけであれば、セキュリティを none に設定しても問題ありませんが、本番環境ではこれを行うことを強くお勧めします。

カスタムバインディング

カスタムバインディングを使用したことはありませんが、次のようなものが機能するはずです:

<bindings>
  <customBinding>
    <binding name="Custom">
      <textMessageEncoding messageVersion="Soap12" />
      <httTransport />
    </binding>
  </customBinding>
</bindings>

これをエンドポイントに (エンドポイントの属性を使用して) 明示的に設定する必要がありbindingConfigurationます。つまり、構成ファイルにエンドポイント定義を作成する必要があります。

カスタム バインディングのアイデアは、BasicHttpBinding を使用した SOAP 1.2 メッセージ フォーマットからのものです。

うまくいけば、これがあなたにいくつかのアイデアを与え、あなたを再び前進させるでしょう.

于 2013-04-28T18:48:54.377 に答える