2017-06-23 114 views
1

我有這個模塊:當HTTP頭已經發送?

public class SecureCookieModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     context.EndRequest += OnEndRequestHandlerExecute; 
    } 

    private void OnEndRequestHandlerExecute(object sender, EventArgs e) 
    { 
     if (!AppConfig.MachineAppSettingsBool("setSecureCookiesForSecureConnections")) 
     { 
      return; 
     } 

     try 
     { 
      HttpApplication app = sender as HttpApplication; 

      if (app.Request.IsReallySecureConnection()) 
      { 
       foreach (string s in app.Response.Cookies.AllKeys) 
       { 
        var cookie = app.Response.Cookies[s]; 

        if (cookie.Secure == false) 
        { 
         cookie.Secure = true; 
         app.Response.Cookies.Add(cookie); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      LogManager.GetLogger("SecureCookieModule").Error("Exception while processing http module. Ex: {0}", ex); 
     } 
    } 
} 

從這個我在某些情況下,響應頭已經發出已寫了,所以他們不能被修改和異常,因爲這個異常。我想念的是在哪種情況下發生這種情況,爲什麼?爲什麼在某些情況下,在執行「OnEndRequestHandlerExecute」事件之前,它們被髮送,而在其他情況下,它們不是?這種情況背後的原因是什麼導致了這種行爲?

在此先感謝!

+2

如果請求處理程序寫入到輸出流,你不能設置cookie,因爲這些走在*** ***頭ERS哪去在***頭** *流。在**請求處理程序啓動後執行此操作**註定會失敗。我很驚訝這個作品。 – spender

+0

所以當處理程序直接寫入響應時,所有的頭文件都會被髮送。我再次檢查它,這是如何工作的。謝謝。 –

回答

1

如果響應沒有被緩存,並且頭部已經發送,那麼在結束請求事件期間不能更改它們,因爲它們已經被寫回到瀏覽器的數據流。

爲了解決這個問題,你有一個選擇:

  1. 打開response buffering上。這樣你的當前代碼將能夠修改緩衝區中的標題(如果你正在處理大型文檔,這可能不是一個好主意)。

    Response.BufferOutput = true; 
    
  2. ,而不是處理EndRequest,處理PreSendRequestHeaders來代替。這個事件保證在標題寫入響應之前觸發。

    public void Init(HttpApplication context) 
    { 
        context.PreSendRequestHeaders += OnEndRequestHandlerExecute; 
    } 
    
+0

context.PreSendRequestHeaders完美地構成了我。謝謝。 –