2011-06-18 116 views
1

我在C#中構建了一個只覆蓋生命週期的EndRequest的http模塊,檢查響應頭的狀態代碼並在需要時修改響應代碼。喜歡的東西:HTTP模塊中的響應修改

HttpContext context = ((HttpApplication)source).Context; 
if (context.Response.StatusCode == 200) 
{ 
    context.Response.StatusCode = 404; 
} 

這似乎很好地工作對我來說,當我測試它針對本地主機(實際IIS),但是當我能夠從另一臺計算機聯網訪問和測試失敗每次。

,當我通過另一臺計算機測試我所看到的錯誤是:

「 HTTP標頭後,服務器不能設置狀態已發送」

我也注意到,請求兩次相同的文件,而在本地它只請求一次文件。我聽到有人說輸出緩衝,但我也嘗試將BeginRequest響應OutputBuffer設置爲true,並得到相同的結果。

想法?

回答

4

您需要在發送標題之前修改響應。我從來沒有這樣做過,但我猜想正確的事件是PreSendRequestHeaderslink

Here's an example在此事件中設置標題。

如果此事件不適用於您,請檢查處理程序在管道中的後處理後的一些事件:http://blogs.msdn.com/b/carloc/archive/2007/12/19/application-page-and-control-lifecycle.aspx請小心,因爲您可能必須重寫IIS 7集成管道的代碼。

+1

只是想我會回來,並關閉了這一點。這裏有兩個問題,其中第一個問題解決了你的建議。第二個問題與管道有關,但不是asp.net的。 IIS有一個「功能」用於在發送某些狀態碼時返回特定的錯誤頁面。這發生在.NET處理後,但你可以關閉它。如果啓用「詳細錯誤」並刪除狀態代碼的處理程序,則會得到未修改的原始頁面內容。默認情況下,僅限本地。 – pinvoke