0

このWSDLで記述されたサービスがあります。このリクエストでその操作createServiceが呼び出されると、すべて問題ありません。このサービスのプロキシ サービスは、WSO2 ESB 4.6.0 で作成されています。プロキシ サービス用に ESB によって生成された WSDL を次に示します。同じリクエストを soapUI を使用してプロキシ サービスに送信しようとすると、次のエラーが発生します。

Operation not found のエンドポイント参照 (EPR) は /services/test.testHttpSoap11Endpoint と WSA Action = です。この EPR が以前に到達可能であった場合は、サーバー管理者に連絡してください。

このリクエストの本文を ESB のプロキシ サービス テスト ツールで送信しても問題ありません。これは、このツールが WS-Addressing を使用して送信しているためだと思います。エンドポイント URL を で追加すると、soapUI でリクエストもスムーズに送信され?createRequestます。この記事によると、問題の原因は SOAPMessageBodyBasedDispatcher です。何らかの理由で、SOAP body 要素の最初の子の QName による対象操作が認識されません。しかし、私の場合、SOAPMessageBodyBasedDispatcher が失敗する理由がわかりません。何か案は?

4

2 に答える 2

3

WSO2 ESB 4.6.0 とそれ以前のバージョンの主な違いは、WSO2 ESB 4.6.0 ではデフォルトでパススルー トランスポート (PTT) が有効になっていることです。PTT は、WSO2 ESB で非常に高いパフォーマンスの向上を実現するために使用されます。数値はhttp://wso2.org/library/articles/2013/01/esb-performance-65で確認できます。

ユースケースの主な問題は、 SOAPMessageBodyBasedDispatcher が操作名をディスパッチすることを期待していることです。SOAPMessageBodyBasedDispatcher はメッセージを作成し、最初の子のローカル名をディスパッチに使用します。この操作は非常にコストがかかると見なされているため、現時点では PPT ではサポートされていません。当面は、予期される SOAPAction を HTTP ヘッダーとして送信して、この問題を取り除くことができます。このスレッドでは、他のいくつかの解決策を提供しました WSO2 ESB 4.6 で公開された WS プロキシにアクセスするときにエラーが発生しました: EPR が見つかりません

于 2013-03-23T12:40:55.273 に答える
2

ここでは、httpGetProcessor を変更しても役に立ちません。transportSender と transportReceiver の構成を変更する必要があります。axis2.xml ファイルで、既存の PTT transportSender/transportReceiver 構成をコメント アウトし、NHTTP transportSender/transportReceiver 構成のコメントを解除できます。

これはESB 4.6.0にあるものです

<transportSender name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpSender">
    <parameter name="non-blocking" locked="false">true</parameter>
</transportSender>

<transportReceiver name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpListener">
    <parameter name="port" locked="false">8280</parameter>
    <parameter name="non-blocking" locked="false">true</parameter>       
    <parameter name="httpGetProcessor" locked="false">org.wso2.carbon.transport.nhttp.api.PassThroughNHttpGetProcessor</parameter>      
</transportReceiver>

必要なのは

<transportReceiver name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOListener">
    <parameter name="port" locked="false">8280</parameter>
    <parameter name="non-blocking" locked="false">true</parameter>
    <parameter name="httpGetProcessor" locked="false">org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor</parameter>
    <parameter name="disableRestServiceDispatching" locked="false">true</parameter>
</transportReceiver>

<transportSender name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOSender">
    <parameter name="non-blocking" locked="false">true</parameter>
</transportSender>
于 2013-03-25T15:11:56.267 に答える