3

Webサービスを利用するためのセキュリティwseヘッダーの送信に問題があり、TargetProcess.comからこのWebサービスを使用するための数十の方法をすでに試しましたが、何が間違っているのかわかりません。

(http://demo.tpondemand.com/Services/ProjectService.asmx?wsdl)

彼らの例では、本当に古いバージョンのNusoapを使用していますが、SoapClientクラスに組み込まれているphp5を使用してこれを実行しようとしています。

BadRequestエラーを受信するか認証できないかの間で立ち往生しています。では、どうすればこれらのヘッダーを送信できますか?

これは私がこれまでに持っているものですが、機能しません:

     $tp_header_part = '
      <wsa:Action>
        http://targetprocess.com/RetrieveAll
      </wsa:Action>
      <wsa:MessageID>
        urn:uuid:'.$this->getGuid().'
      </wsa:MessageID>
      <wsa:ReplyTo>
        <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
      </wsa:ReplyTo>
      <wsa:To>http://medios.tpondemand.com/Services/ProjectService.asmx</wsa:To>
      <wsse:Security SOAP-ENV:mustUnderstand="1">
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
          wsu:Id="SecurityToken-'.$this->getGuid().'">
        <wsse:Username>MYUSERNAME</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
          MYPASSWORD
        </wsse:Password>
        </wsse:UsernameToken>
      </wsse:Security>';


$soap_var_header = new SoapVar( $tp_header_part, XSD_ANYXML, null, null, null );

$soap_header = new SoapHeader( 'http://schemas.xmlsoap.org/ws/2003/06/secext', 'Security', $soap_var_header );
$client->__setSoapHeaders($soap_header);

ps getGuid関数は、ドキュメントごとに必要なGUIDを生成するだけです。

何か案は?

4

1 に答える 1

1

ターゲット サーバーが .NET/ASP を使用して記述されている場合、「完全な」XML 要求を取得することに非常に手間がかかる可能性があります。たとえば、名前空間プレフィックスを使用する場合、XML にも名前空間の宣言を含めることが不可欠です。

あなたの XML (wsa、wsse、SOAP-ENV) の名前空間の例をいくつか見ることができますが、これらは宣言されていないようです。PHP SoapClient がそれらを自動的に入力できた場合は驚くでしょう。完全に宣言しているように見える唯一のものは、SoapHeader オブジェクトの開始を通じて、'wsse' = 'http://schemas.xmlsoap.org/ws/2003/06/secext' です。

可能であれば、PHP とターゲット サーバーの間にパケット スニファー ( Fiddler2 など) を配置して、何が送受信されているかを正確に確認します。これにより、エラーの追跡がはるかに容易になり、XML が拒否された理由を突き止めることができます。

最初のコードに 2 つの変更を加えることをお勧めします。これにより、「有効な XML」にする必要があります。

  • wsa:Action - 追加xmlns:wsa="<URL for definition of WSA>"
  • SoapHeader - 確かではありませんが、名前空間 URI をここに配置したため、オブジェクト名に名前空間プレフィックスを含める必要がある場合があります。

    $soap_header = new SoapHeader( 'http://schemas.xmlsoap.org/ws/2003/06/secext', 'wsse:Security', $soap_var_header );
    

ただし、最も重要なことは、PHP クライアントとターゲット サーバーの間で正確な HTTP 通信を取得する方法を見つけることです。また、比較対照する実際の例も取得できれば、通常は 100% 作業が楽になります!

于 2012-03-06T12:09:54.037 に答える