Windows Server 2008 ボックスの IIS 7.5 で統合モードで実行されている古い ATL Server Web サービスに SOAP メッセージ ログ機能を追加しようとしていますが、奇妙な問題が発生します。さらに詳しい背景として、HttpModule を含むアセンブリを、ATL Server Web サービスの web.config の modules 要素に追加しました。
ここで提供されている回答に従っていますが 、ログ自体はうまく機能します。
ただし、このロギング機能を使用すると、サービスは「SOAP Invalid Request」で応答しますが、ログ ファイルには期待どおりの SOAP メッセージがあります。私はそれをいじくり回しましたが、これは、BeginRequest イベントのハンドラーで要求オブジェクトの InputStream プロパティにアクセスした場合にのみ発生することがわかりました。次のように変数を InputStream の長さに設定するだけでも失敗します。
private void OnBegin(object sender, EventArgs e)
{
var request = _application.Request;
//this will blow up
var foo = request.InputStream.Position;
}
ハンドラーで InputStream に触れない場合 (明らかに、リクエストの内容をログに記録するためだけにこれを行っている場合はあまり効果がありません)、リクエストは完全に処理されます。
Request オブジェクトのヘッダー値や関連する HttpApplication のその他のさまざまなプロパティにアクセスできますが、InputStream にアクセスするとサービスが停止します。
このログの実行を妨げる ATL Server 固有の何かがありますか? これが動作することを確認するために、BeginRequest ハンドラーにある種のロックまたはその他のセーフガードを追加する必要がありますか? ハンドラーが何らかの形で InputStream をホースアップしているため、サービスで使用できませんか?
これにアプローチするもう 1 つの方法は、リクエストがサービスに到達したとき (つまり、この HttpModule が実行された後) にリクエストを確認する方法があるかどうかを尋ねることです。
また、SoapUI を使用してサービスをテストしていることにも注意してください。
編集: IIS で失敗した要求のトレースを実行したところ、次のエラー メッセージが表示されます。
ModuleName IsapiModule
Notification 128
HttpStatus 500
HttpReason Internal Server Error
HttpSubStatus 0
ErrorCode 0
ConfigExceptionInfo
Notification EXECUTE_REQUEST_HANDLER
ErrorCode The operation completed successfully. (0x0)
これは、ATL Server Web サービスのハンドラー (つまり、サービスの DLL) に含まれます。その直前に「GENERAL_READ_ENTITY_START」と「GENERAL_READ_ENTITY_END」のメッセージがあり、「END」には次のメッセージがあります。
BytesReceived 0
ErrorCode 2147942438
ErrorCode Reached the end of the file. (0x80070026)
それは私がそれが意味すると思うことを意味しますか?ハンドラーがデータを取得していないということですか? これは、私の HttpModule が Request の InputStream をいじっていることを示している証拠ですか?