2012-05-17 202 views
1

我想添加一些SOAP消息日誌記錄功能,以舊的ATL服務器Web服務在Windows Server 2008框中IIS 7.5集成模式下運行,但運行到一個奇怪的問題。爲了進一步的背景,我已經將包含HttpModule的程序集添加到ATL Server Web服務的web.config的modules元素中。HttpModule ATL服務器服務InputStream失敗

我一直在追蹤提供的答案here和記錄本身的偉大工程。

但是,無論何時使用此日誌記錄功能,服務都會響應「SOAP無效請求」,而日誌文件具有預期的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(不這樣做,當我只有多好這樣做顯然會記錄請求的內容),請求會很好地完成。

我可以訪問請求對象中的標題值以及涉及的HttpApplication的各種其他屬性,但訪問InputStream會導致服務窒息。

ATL服務器有內在的東西會阻止我做這種日誌記錄嗎?我是否需要在我的BeginRequest處理程序中添加某種鎖定或其他安全措施以確保其行爲?我的處理程序是否以某種方式使InputStream陷入了無法使用的狀態?

解決這個問題的另一種方法是詢問是否有辦法看到請求到達我的服務(即在此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服務器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嗎?

回答

0

所以我最終確定這不是一個可行的方法:我無法讓HttpModule在IIS 6中啓動(我需要讓它爲它做一個可接受的解決方案)。我嘗試在Request對象上設置Filter屬性以及其他各種瘋狂的想法,但都沒有讓我能夠在HttpModule中記錄請求主體並使服務仍然有效。

所以我做了更多的挖掘,並在codeproject上討論了關於ATL Server的內部運作的文章,特別是atlsoap.h中的HandleRequest方法。我在那裏徘徊了一段時間,想出了一種方法來獲取請求主體,並且從那裏手動將其寫入文件非常簡單。

對於那些好奇,這是我加入的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********************************************************** 

我將仍然發揮與它周圍多一點,但我有什麼似乎是一個可行的解決方案。

0

你確定你的請求對象是有效的嗎?你所做的事情與你參考的樣本略有不同。他們從發送者參數中提取流,而你顯然依賴於成員變量。

+0

好問題(並感謝回覆),但是,我確定該請求是有效的。我已經嘗試過使用與相同結果鏈接的示例的確切語法。我也做了一個健全的檢查,並將這個HttpModule添加到一個普通的簡潔的ASP.NET網站,它工作正常(請求被記錄並顯示在目標頁面中)。很奇怪。 –