2

PHP 5.3 を使用して WSDL ベースの SOAP Web サービスを作成しました。私は Zend Framework を使用してサービスを処理しており、ZF は PHP の組み込み SoapServer クラスの上に配置されています。

SoapUI でテストしたところ、無効な型のパラメーターを渡す (たとえば、整数が WSDL で定義されている場合に文字列を渡す) と、空の応答が返されることがわかりました。コードを調べてみると、ZF が SoapServer->handle() を呼び出すと、次の致命的なエラーで実行が停止することがわかりました。

Fatal error: SOAP-ERROR: Encoding: Violation of encoding rules

エラーは理にかなっていますが、私の人生では、それを適切に処理できるようにキャプチャする方法がわかりません。私の理解では、 handle() は例外をスローする必要がありますが、代わりに単に死んでいます。

しかし、ここからが実に怪しい……。

コードを変更せずに SoapUI で複数のテストを実行すると、異なる結果が生成されます。ほとんどの場合、空の応答が返されますが、ときどき SoapFault が返されます (予想どおりです!)。ただし、一貫性がなく、どちらの場合も何が原因かわかりません。私が知る限り、SoapUI のキャッシング機能と WSDL キャッシングをオフにしています。SoapUI によるものか PHP によるものかはわかりません。私が言ったように、奇妙です。

関連して、私はこの古い PHP バグを見つけました:

http://bugs.php.net/36629

それは私自身の問題のようにひどく聞こえます。ただし、これが私の問題であると完全に確信しているわけではありません。これは主に、これらすべてをカバーする PHP ドキュメントと ZF のドキュメントがひどく不完全であるためです。したがって、私は単にひどく間違ったことをしていて、それを知らないだけかもしれません. それを踏まえて、エラーをトラップして処理する適切な方法を示す単純なシェルを見たいと思っています。しかし、私はそこにいる人々が提供できるかもしれないあらゆる助けを借ります.

4

2 に答える 2

1

コメントを試していただけますか: https://bugs.php.net/bug.php?id=50547#1298563236 (ページの 3 番目のコメント)?

Xdebug に問題がある可能性があります。handle() メソッドを呼び出す前に xdebug_disable() を使用すると、サーバーは問題が発生したことを示す適切な SOAP メッセージで応答します。

私はまったく同じ問題を抱えていました (時には空の応答、時には正しい SoapFault)。xdebug_disable()助かりました。

于 2012-04-20T14:34:05.547 に答える
0

不適切な XML を送信すると、Zend Framework は SoapFault Exception を送信します。

// Zend/Soap/Server.php line 818
try {
    $this->_setRequest($request);
} catch (Zend_Soap_Server_Exception $e) {
    $setRequestException = $e;
}

このコードでは、Exception のみが SoapFault に変換されました。しかし、すべての PHP エラーは例外をスローせず、SoapServer はエラーを表示しません:

// Zend/Soap/Server.php line 857
protected function _initializeSoapErrorContext()
{
    $displayErrorsOriginalState = ini_get('display_errors');
    // Delete this line to view error in developement
    ini_set('display_errors', false);

    set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR);
    return $displayErrorsOriginalState;
}

いつも SoapFault を返す方法がわかりません。ごめん。私は探しています ... ;)

于 2011-01-03T14:19:27.353 に答える