IIS 6.0 でホストされている .net Web サービスがあり、クライアントが wsdl と一致しないデータで接続するため、定期的に http 500 で失敗します。
メソッドで int 型として指定された要素があり、受信 xml 要素に 10 進数が含まれているようなものです。
WSDL 要素の定義:
<s:element minOccurs="1"
maxOccurs="1"
form="unqualified" name="ItemCount" type="s:int" >
提供された要素:
<ItemCount>1.0</ItemCount>
これにより、iis ログに 500 エラーが残りますが、ソープ エラーの情報やエラーの原因となった入力データは返されません。
現在、wireshark を使用してすべてをキャプチャすることによって提供されるデータに関するいくつかの問題を診断しましたが、おそらくそれほど邪魔にならない他のオプションを知りたいです。
500 エラーの原因となっている送信中のデータをキャプチャする方法はありますか (できれば、500 エラーが発生したときにのみデータをキャプチャします)。おそらく次の方法で:
- IIS の構成
- Web サービスの構成
- Web サービスのコードを変更する
tbreffniによって提供された回答をテストした後に編集
tbreffni の後の私に最もよく合った答え - 他にもいくつかの良い応答がありましたが、その答えにより、fiddler や wireshark などを実行しなくても、デシリアライゼーション エラーを引き起こすペイロードをキャプチャできます。
SOAP 拡張機能を実際に実行するための情報は少し軽いので、必要な手順を以下に示します。
- MSDNの記事 に従って、SOAP 拡張機能を .dll としてビルドします。
- トレースするサービスの bin ディレクトリに .dll を追加します。
トレースするサービスの web.config で、次を webServices セクションに追加し、SOAPTraceExtension.TraceExtension と SOAPTraceExtension を拡張機能に一致するように置き換えます。
<webServices>
<soapExtensionTypes>
<add type="SOAPTraceExtension.TraceExtension, SOAPTraceExtension" priority="1" group="0"/>
</soapExtensionTypes>
</webServices>