1

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 をいじっていることを示している証拠ですか?

4

2 に答える 2

0

リクエスト オブジェクトは有効ですか? ここでは、参照するサンプルとは少し異なることをしています。彼らは送信者引数からストリームを抽出していますが、明らかにメンバー変数に依存しています。

于 2012-05-18T00:26:48.063 に答える
0

そのため、これは実行可能なアプローチではないと最終的に判断しました。IIS 6 で HttpModule をまったく起動できませんでした (受け入れられるソリューションにするためには、これを実行する必要があります)。Request オブジェクトに Filter プロパティを設定したり、その他のあらゆる種類のクレイジーなアイデアを設定しようとしましたが、HttpModule にリクエスト本文を記録し、サービスを引き続き機能させることができるようになるものはありませんでした。

そこで、さらに掘り下げて、ATL サーバーの内部動作、特に atlsoap.h の HandleRequest メソッドについて説明しているcodeprojectに関するこの記事にたどり着きました。私はしばらくそこをいじり、そこにあるリクエスト本文を取得する方法を見つけました。そこから手動でファイルに書き込むのは非常に簡単でした。

好奇心旺盛な方のために説明すると、これが HandleRequest() に追加した最終的なコードです。

//****************************************REQUEST LOGGING**********************************************************
        BYTE* bytes = pRequestInfo->pServerContext->GetAvailableData();
        FILE* pFile;
        pFile = fopen("C:\\IISLog\\ATL.txt", "a");
        fwrite(bytes, 1, pRequestInfo->pServerContext->GetAvailableBytes(), pFile);
        fclose(pFile);
//****************************************REQUEST LOGGING********************************************************** 

もう少しいじってみるつもりですが、実行可能な解決策と思われるものがあります。

于 2012-05-18T20:11:33.653 に答える