2017-06-23 116 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完美地构成了我。谢谢。 –