1

php/soap で WSDL Web サービスを使用しようとしています。そして、常に正確な逆シリアル化エラーが発生します。

操作 'Test' の要求メッセージの本文をデシリアライズ中にエラーが発生しました。OperationFormatter で無効なメッセージ本文が検出されました。名前が 'Test' で名前空間が '' のノード タイプ 'Element' が見つかるはずです。名前が 'parameters' および 'namespace' のノード タイプ 'Element' が見つかりました

WcfTestClient ソフトウェアを使用して WSDL ソースをテストすると、問題はなく、望ましい結果が返されます。

SOAP で作成されたリクエスト XML と WcfTestClient ソフトウェアで作成された XML を比較すると、その違いが問題であることがわかります。名前空間と接頭辞に問題があるように見えますが、解決方法がわかりません。または、他の何かが問題を引き起こしている可能性があります。

リクエスト XML はhttp://pastebin.com/eysnG89Fです。

PHPコードが必要な場合のために、これは私が使用しているコードです.

try{
        $soap_options = array(
            'soap_version' => SOAP_1_1,
            'cache_wsdl'   => WSDL_CACHE_NONE,
            'trace' => TRUE
        );
        $soap = new SoapClient(
            'http://url.to/web/service.svc?wsdl', $soap_options
        );
        $a = $soap->Test(
           array("login" => 
               array(
                   "FirmaId"      => 15, 
                   "KullaniciAdi" => "Asdf", 
                   "Parola"       => "Xyxy",
               )
           )
         );
        var_dump($a);
} catch (Exception $e) {
        var_dump($e);
}
4

1 に答える 1

0

正確な原因と解決策を見つけることはできませんが、これは機能しているようです。

まず、wsdl メソッドに配列の代わりにオブジェクトを指定すると、項目、値ノードを取り除くことができます。ノードはオブジェクト名で作成されます

$a = $soap->Test(
       (object)array("login" => 
           (object)array(
               "FirmaId"      => 15, 
               "KullaniciAdi" => "Asdf", 
               "Parola"       => "Xyxy",
           )
       )
     );

その後、リクエストxmlで作成された < WsdlMethod> ノードの代わりに < parameters> ノードを実現しました。__doRequest メソッドをオーバーライドして文字列を置き換えることで、この問題を取り除くことができますが、それでも応答が表示されません。str_replace を介して < wsdlMethodResponse> ノードを < parameter> でラップし、最終的に目的の応答を取得する必要があります。

私が言ったように、これは一時的な解決策かもしれません。しかし、私のために働いています:)

于 2013-04-15T12:37:51.537 に答える