Web Service Consumer Connector のトラブルシューティング - Mule 4

Web サービスコンシューマー用 Anypoint Connector (Web Service Consumer Connector) をトラブルシューティングするには、ワイヤーロギングの有効化、添付ファイルへのアクセスのトラブルシューティング、デザイン時の WSDL の問題のトラブルシューティング、一般的なエラーメッセージの解釈に関する情報について理解しておいてください。

ワイヤーロギングを有効化する

Web Service Consumer Connector のトラブルシューティングを開始するには、Web サービスコンシューマーでトランスポート要求と応答を調べます。 基礎となる HTTP トランスポートを使用している場合、ワイヤーロギングを有効化して正確な HTTP メッセージ、トランスミッションヘッダー、応答状況を確認できます。

ワイヤーロギングを有効化する手順は、次のとおりです。

  1. Anypoint Studio にアクセスし、​[Package Explorer]​ ビューに移動します。

  2. アプリケーションのプロジェクト名を開きます。

  3. src/main/resources​ パスフォルダーを開きます。

  4. フォルダー内の ​log4j2.xml​ ファイルを開きます。

  5. 次の行がすでに ​log4j2.xml​ ファイル内にある場合は、そのコメントを解除して有効にします。それ以外の場合、次の行を追加します。

    <AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger" level="DEBUG" />
  6. 変更を保存します。

  7. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)]​ > ​[Run As (別のユーザーとして実行)]​ > ​[Mule Application (Mule アプリケーション)]​ をクリックします。

  8. [Console (コンソール)]​ ビューに移動し、ロガーの HTTP メッセージを読み取ります。

    POST /essentials/delta HTTP/1.1
    soapaction:
    Host: ilt.mulesoft-training.com
    User-Agent: AHC/1.0
    Connection: keep-alive
    Accept: */*
    Content-Type: text/xml; charset=UTF-8
    Transfer-Encoding: chunked
    
    b1
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns0:listAllFlights xmlns:ns0="http://soap.training.mulesoft.com/"/></soap:Body></soap:Envelope>
    
    DEBUG 2021-04-06 15:04:23,058 [[wsc-base].wsc-dispatcher.11 SelectorRunner] [processor: ; event: ] org.mule.service.http.impl.service.HttpMessageLogger.wsc-dispatcher: REQUESTER
    0
    
    
    DEBUG 2021-04-06 15:04:23,319 [[wsc-base].wsc-dispatcher.11 SelectorRunner] [processor: ; event: ] org.mule.service.http.impl.service.HttpMessageLogger.wsc-dispatcher: REQUESTER
    HTTP/1.1 200
    Date: Tue, 06 Apr 2021 18:04:23 GMT
    Content-Type: text/xml; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    MULE_ENCODING: UTF-8
    Strict-Transport-Security: max-age=31536000; includeSubdomains;
    X-Content-Type-Options: 1
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    
    bfe
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:listAllFlightsResponse xmlns:ns2="http://soap.training.mulesoft.com/">...

添付ファイルへのアクセスのトラブルシューティング

一部のサーバーは、MTOM (Message Transmission Optimization Mechanism) メッセージを送信することで要求に応答します。これらのメッセージではデータが各パートに分けられ、これによってさまざまな種類のコンテンツデータを同じ HTTP メッセージに含めることができます。

MTOM が個別のパートのバイナリデータの送信と、SOAP エンベロープ内の対応する項目からのそのパートの参照を担当します。 Web サービスコンシューマーユーザーは、MTOM 設定のみを使用してこれらのメッセージ (マルチパート) を操作します。

MTOM についての詳細は、次のドキュメントを参照してください。

バージョン 1.6.4 以降の Web Service Consumer Connector では、Web サービスコンシューマーのグローバル設定での MTOM 設定に関係なく、MTOM 応答も自動的に管理する要求メッセージ用に MTOM を設定できるようになっています。MTOM を使用した受信メッセージは、Web サービスコンシューマーのグローバル設定で MTOM が設定されているかどうかに関係なく、MTOM 対応として扱われます。

次の例は、MTOM が有効になった Web Service Consumer Connector のグローバル設定を示しています。

「MTOM」 項目が TRUE に設定された Web サービスコンシューマーのグローバル要素
Figure 1. Web Service Consumer Connector のグローバル要素

XML エディターでは、​<wsc:config>​ および ​mtomEnabled​ の設定は次のように記述されます。

<wsc:config name="Web_Service_Consumer_Config" doc:name="Web Service Consumer Config">
    <wsc:connection wsdlLocation="http://ilt.mulesoft-training.com/essentials/delta?wsdl" service="TicketServiceService" port="TicketServicePort" address="http://ilt.mulesoft-training.com/essentials/delta" mtomEnabled="true">
        <wsc:web-service-security actor="http://schemas.xmlsoap.org/soap/actor/next" />
    </wsc:connection>
</wsc:config>

サーバー側のマルチパート設定に応じて、サーバーが一部のバイナリデータを Base64 エンコードされたテキスト項目または MIME メッセージで参照されるバイナリパートとして送信する場合もあります。

バイナリデータへのアクセスをトラブルシューティングする手順は、次のとおりです。

  • サーバーがバイナリデータを Base64 エンコードされたテキスト項目として送信する場合、メッセージのパートとしてこの項目にアクセスする必要があります。
    Base64 のでコードは Web サービスコンシューマーによって自動的に実行されます。

  • サーバーがバイナリデータを参照されるバイナリパートとして送信する場合、添付ファイルとしてこの項目にアクセスする必要があります。

    次の例は、Web サービスサーバーによって MTOM を使用して添付ファイルとして送信される画像を示しています。DataWeave を使用して画像にアクセスし、JSON に変換します。この場合、Base64 エンコーディングが必須です。

    import * from dw::core::Strings
    import dw::core::Binaries
    output application/json
    ns nam http://mynamespace.com
    ---
    {
    ...
    "image": Binaries::toBase64(payload.attachments[0]),
    ...
    }

デザイン時の WSDL の問題のトラブルシューティング

不正な WSDL の認識、取得、解析に関連したエラーがあると、次のような問題が発生することがあります。

  • DataSense によって WSDL で定義されたメッセージメタデータが正しく公開されない。

  • Web Service Consumer Connector の設定画面で、​[Operations (操作)]​ 項目にコネクタが呼び出す Web サービス操作名が一切表示されない。

    空白になっている Web Service Consumer Connector の [Operations (操作)] 項目
    Figure 2. Web Service Consumer Connector の [Operations (操作)] 項目
  • Web Service Consumer Connector のグローバル要素設定で、WSDL の場所が指定されている場合に ​[Port (ポート)]​ 項目と ​[Address (アドレス)]​ 項目が自動的に入力されない。

    Web Service Consumer Connector のグローバル要素ウィンドウで、WSDL の場所が選択されているとポート項目とアドレス項目が自動的に入力されません。
    Figure 3. Web Service Consumer Connector のグローバル要素

これらの問題を解決する手順は、次のとおりです。

  • お好みのオンラインまたはデスクトップのビューアーアプリケーションを使用して WSDL の整合性をチェックします。
    設定中のすべての解析エラーがデザイン時に表示されるわけではないため、外部アプリケーションの実装はこれらのエラーの検出に役立ちます。

  • Studio で WSDL をアプリケーションの ​src/main/resources​ フォルダーのリソースとして追加しない場合は、WSDL をホストするサーバーへの正しい接続を確認してください。
    場合によって、HTTP セキュリティレイヤーの HTTP サーバーにアクセスするために、OAuth 設定やユーザー/パスワード設定などのカスタム HTTP 設定を追加する必要があることもあります。​「カスタム HTTP トランスポートの設定」​を参照してください。

[Must Understand (理解が必要)] エラーのトラブルシューティング

Mule Web Service Consumer アプリケーションで ​WSC:CANNOT_DISPATCH​ というエラーがスローされ、サードパーティサーバーからの HTTP 応答でコネクタに起因するエラーの例外として ​<faultcode>soap:MustUnderstand</faultcode>​ が返された場合、Web Service Consumer Connector のセキュリティ設定の ​[Must Understand (理解が必要)]​ 項目がデフォルト値の ​true​ に設定されていることを示します。

この問題を回避するには、​[Must understand (理解が必要)]​ 項目を ​false​ に設定します。コネクタ側では、この属性のデフォルト値は ​true​ ですが、SOAP プロトコル側では、​[Must Understand (理解が必要)]​ 属性が指定されていない場合の暗黙的な値は ​false​ になります。 SOAP 要求の ​[Must Understand (理解が必要)]​ 属性を明示的に使用する必要がない場合、この値を ​false​ に設定します。

値が false に設定されている Web サービスコンシューマーの [Must Understand (理解が必要)] 設定

返される HTTP 応答には、​<faultcode>soap:MustUnderstand</faultcode>​ 例外を確認するための圧縮されたペイロード本文または圧縮されていないペイロード本文が含まれます。 HTTP レスポンスヘッダーの ​Content-Encoding​ が ​gzip​ の場合、ペイロード本文が圧縮されていることを示します。例については、次の HTTP 応答を確認してください。ここでは、�RMo�0�W��� のような圧縮文字を確認できます。

HTTP/1.1 500 Internal Server Error
X-OPNET-Transaction-Trace: a2_ba571488-537c-4839-94a9-48f3f08fadf3
Content-Encoding: gzip
Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:83b066a2-fb96-4abf-a687-dd178a5b3e29"; start="<root.message@cxf.apache.org>"; start-info="text/xml"
Content-Length: 363
X-Cnection: close
Date: Wed, 23 Nov 2022 13:41:25 GMT
Connection: close
Set-Cookie: dc=dcs; Path=/; Version=1; Secure; Httponly; Max-Age=900
Strict-Transport-Security: max-age=31536000

�???????�RMo�0�W���N!�c-�M�:i��֞�1�&(h�_h���v���l?[�iJ��4X,`��t��sHs�pɥ�,C�Og8]�GOZYT��#u]��R+����=Vk�`�f�{��Y��x[+�]�0�(G÷*ӲT�����]$������?"�!ksj�
��9$��x��:ڪ/�t��5Q���+��#!�ɏ@��z��} pH^r��e7�/�T6���r�09�o
ٽ�hȂ����g%Y�&Ine�@��}������@%q�_�,}�i�E0g���`֘�v�n�|�~K��}�?dJ[֜;k-���`+ף������^�����Y9E??

応答のペイロード本文を圧縮解除するには、Mule アプリケーションで ​Error Handler​ コンポーネントを使用してスローされたエラーをキャッチし、Compression Module ​Decompress​ 操作を使用して応答を圧縮解除する必要があります。

Studio で、​[Decompress]​ 操作の設定画面に移動し、​[Compressed (圧縮済み)]​ 項目を次の式に設定して、圧縮されたペイロードを読み取り、​error.exception.errorMessage.typedAttributes.value.headers.​ という例外をキャッチします。

式の値が含まれる圧縮された項目セット

その後、Mule アプリケーションの ​Logger​ コンポーネントを使用して、例外が含まれるペイロード本文全体を記録します。たとえば、次のログには、​<faultcode>soap:MustUnderstand</faultcode>​ が含まれる圧縮解除されたペイロード SOAP 本文が表示されています。

INFO  2022-11-23 14:57:05,247 [[MuleRuntime].uber.05: [ri-uhip-integration-esb-1095brequesttransmitterservice2_11-02-20221].BulkRequestTransmitter:\soapkit-config.BLOCKING @3f46eb07] [processor: BulkRequestTransmitter:\soapkit-config/processors/4/errorHandler/0/processors/2; event: 58ed0ad0-6b57-11ed-b9ce-147ddaa4cf6c] org.mule.runtime.core.internal.processor.LoggerMessageProcessor: --uuid:223e386d-3093-4df4-b5f9-9cb3b9a493a2
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:MustUnderstand</faultcode><faultstring>MustUnderstand headers: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood.</faultstring></soap:Fault></soap:Body></soap:Envelope>
--uuid:223e386d-3093-4df4-b5f9-9cb3b9a493a2--

システムプロパティのトラブルシューティング

  • mule.soap.maxAttributeSize​ (デフォルト値 = 524288)

XML パーサーライブラリには、属性値の最大許容長 (文字数) を指定する ​mule.soap.maxAttributeSize​ システムプロパティ値の制限があります。この制限により、特別に作成されたドキュメントで XML ベースの Web サービスを攻撃する潜在的なサービス拒否 (DoS) 攻撃から保護されます。この攻撃を受けると、過剰なメモリや計算能力が使用されて処理の問題が発生する可能性があります。

デフォルト値は 524288 文字で、通常の使用状況では妥当な値です。入力ドキュメントが正当にこのデフォルトの制限を超える可能性がある場合はより高い値に変更できます。特定の攻撃が観察された場合や、システムのリソース割り当てが少ない場合はより低い値に変更できます。

値の制限を変更する 1 つのシグナルは、正当なドキュメントの処理時に「​javax.xml.stream.XMLStreamException: Maximum attribute size limit (524288) exceeded (javax.xml.stream.XMLStreamException: 最大属性サイズ制限 (524288) を超えました)​」という例外が発生したときです。

この値を変更するには、ニーズに合わせて正確な数値で ​mule.soap.maxAttributeSize​ システムプロパティを設定する必要があります。ナレッジ記事 「How can I set Mule and Java system properties at startup? (起動時に Mule および Java システムプロパティを設定する方法は?)」​を参照してください。最大許容値は 2147483647 (Java では Integer.MAX_VALUE​) です。プロパティを 0 に設定した場合やプロパティを設定しない場合、コネクタではデフォルト値が使用されます。

一般的なスローの理解

次に、一般的なスローメッセージとその解釈方法のリストを示します。

  • WSC:SOAP_FAULT

    Error matching the SOAP response with the format provided by the WSDL. (SOAP 応答を WSDL によって指定された形式にマッチングするときにエラーが発生しました。)
    Every CXF SOAP fault error is wrapped in a ​`WSC:SOAP_FAULT`​. (すべての CXF SOAP 失敗エラーは ​`WSC:SOAP_FAULT`​ でラップされます。)
  • WSC:BAD_REQUST

    The Web Service Consumer Connector operation does not exist in the WSDL. (Web Service Consumer Connector 操作が WSDL に存在していません。)
    The request body is not a valid XML. (リクエストボディが有効な XML ではありません。)
  • WSC:INVALID_WSDL

    The WSDL is poorly formatted. (WSDL の形式が正しくありません。)
  • WSC:EMPTY_RESPONSE

    Occurs when mandatory fields are missing from the response (Illegal Empty Response).(応答に必須項目がない場合 (無効な空の応答) に発生します。)