2016-08-25 8 views
5

私は、Railsで多量のSOAP APIを扱う素敵な仕事をしています。 SOAPサービスには3つの異なるバインディングがあります。 wsHttpBinding、x509でのwsHttpBinding、およびカスタムバインディング。私はちょうどwsHttpBindingでエンドポイントの2つを押すことができますが、3番目のユーザー名とパスワードが必要です。私は証明書のためにx509を避けています。カスタムバインディングはSoapUIでうまくいきますが、Savonでは以下のエラーが出ます。カスタムバインドを使用したSavon

EndpointDispatcherでContractFilterの不一致が原因で、アクション ''のメッセージを受信者で処理できません。これは、契約の不一致(送信者と受信者の間の不一致)または送信者と受信者の間のバインディング/セキュリティの不一致のいずれかが原因である可能性があります。送信者と受信者が同じ契約と同じバインディング(セキュリティ要件、たとえばメッセージ、トランスポート、なしなど)を持っていることを確認します。

Savonで生成された正確なXMLを取得してSoapUIに入れています。

これはバインディングの問題ですか?このカスタムバインディングを使用するように指示する方法はありますか?ここで

それが助け包み、私はここでApp.configファイル

<bindings> 
    <customBinding> 
    <binding name="cust"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport /> 
    </binding> 
    <binding name="cust1"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport /> 
    </binding> 
    <binding name="cust2"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport /> 
    </binding> 
    </customBinding> 
</bindings> 
<endpoint address="http://api.xyz.com/stuff.svc/cust" 
    binding="customBinding" bindingConfiguration="cust" contract="stuff.Xstuff" 
    name="cust" /> 

編集#1

で見つけたカスタムバインディングは、私の現在のクライアントのセットアップです。

@client = Savon.client(
     wsdl: 'http://api.xyz.com/stuff.svc?wsdl', 
     wsse_auth: %w'username password', 
     wsse_timestamp: true, 
     raise_errors: false, 
     log: true, 
     log_level: :debug, 
     soap_version: 2, 
     pretty_print_xml: true, 
     convert_request_keys_to: :none, 
     use_wsa_headers: true, 
     headers: {'Content-Type' => 'application/soap+xml; charset=utf-8'} 

編集#2

私は問題を発見しました。 SavonはSoapUIのようなContent-Typeのアクションを設定していませんでした。 @RicardoPontualがSavonとSoapUIリクエストを再度比較しようと提案してくれたことに感謝します。これにより、私はそれをもっと近くで見て、問題に気づかせました。

あなたはこのように、 のContent-Typeヘッダに action="tempuri.org/stuf‌​f/set_table_stuff"'を設定する必要が
headers: {'Content-Type' => 'application/soap+xml;charset=UTF-8;action="tempuri.org/stuf‌​f/set_table_stuff"'} 
+0

soapメッセージをsavonクライアントとSOAP UIの両方から検査しようとしましたか?サービスのログインを有効にすると、入ってくるSOAPメッセージを検査して、関連する相違点を調べることができます。 –

+0

私はサバンがいくつかの必要なヘッダーまたは名前空間を送信していないと思われ、両方の要求を比較し、結果を投稿してください。 –

+0

@RicardoPontualこれまで、私は両方のリクエストを比較しようとしましたが、これを提案して、もう一度見直しました。そして私はその問題を見つけました! SoapUIがContent-Typeでアクションを設定していることがわかります。 {'Content-Type' => 'application/soap + xml; charset = UTF-8; action = "http://tempuri.org/stuff/set_table_stuff"'}このヘッダーに「ヘッダー」を変更しました。今それは動作します。 Savonはそれを適切に設定していないようだ。 – KevinM

答えて

1

@client = Savon.client(
     wsdl: 'http://api.xyz.com/stuff.svc?wsdl', 
     wsse_auth: %w'username password', 
     wsse_timestamp: true, 
     raise_errors: false, 
     log: true, 
     log_level: :debug, 
     soap_version: 2, 
     pretty_print_xml: true, 
     convert_request_keys_to: :none, 
     use_wsa_headers: true, 
     headers: {'Content-Type' => 'application/soap+xml;charset=UTF-8;action="tempuri.org/stuf‌​f/set_table_stuff"'} 
    ); 
2

:私たちはあなたが消費したい操作のアクションでヘッダーを追加し、コメントで話を何に基づい

@client = Savon.client(
     wsdl: 'http://api.xyz.com/stuff.svc?wsdl', 
     wsse_auth: %w'username password', 
     wsse_timestamp: true, 
     raise_errors: false, 
     log: true, 
     log_level: :debug, 
     soap_version: 2, 
     pretty_print_xml: true, 
     convert_request_keys_to: :none, 
     use_wsa_headers: true, 
     headers: {'Content-Type' => 'application/soap+xml; charset=UTF-8; action="tempuri.org/stuf‌​f/set_table_stuff";'} 
関連する問題