添加标头时在end_request中抛出异常

时间:2011-08-25 23:02:41

标签: c# asp.net-mvc http-headers global-asax

偶尔我会抛出这个异常(在elmah中可见)

System.Web.HttpException: 
Server cannot append header after HTTP headers have been sent.

System.Reflection.TargetInvocationException: Exception has been thrown by the target 
of an invocation. ---> System.Web.HttpException: Server cannot append header after 
HTTP headers have been sent.
   at System.Web.HttpHeaderCollection.SetHeader(String name, String value, 
       Boolean replace)
   at System.Web.HttpHeaderCollection.Add(String name, String value)
   at BettingOnYou.MvcApplication.Application_EndRequest() in /Global.asax.cs:line 55

此行对应于:

protected void Application_EndRequest()
{
    // By default, IE renders pages on the intranet (same subnet) in compatibility mode.  
    // IE=edge forces IE to render in it's moststandard mode possible.  
    // IE8 Standards in IE8, IE9 Standardss in IE9, etc..
    //
    // Chrome=1 causes ChromeFrame to load, if installed.  This allows IE6 to use
    // a Chrome frame to render nicely.
    Response.Headers.Add("X-UA-Compatible", "IE=edge, Chrome=1");
}

有更合适的地方吗?我知道EndRequest看起来很奇怪,但每个使用它的人都把它放在这里。

2 个答案:

答案 0 :(得分:2)

Application_BeginRequest会是一个更好的地方。除非你在申请中的其他地方有某种原因要等到最后,但在常见情况下我想不出一个好理由。

如果你真的想把它保留在Application_EndRequest中,你可以提前打开输出缓冲(Response.BufferOutput = true;,就像在Page_Load中一样),所以在请求发出之前不会发送标题完全处理。虽然输出缓冲有利有弊,所以如果你想尝试一下,请务必阅读。

答案 1 :(得分:0)

为了这里登陆的人的利益,还有另一种添加X-UA兼容(或任何其他此类标头)的方法。您还可以在主页中包含X-UA-Compatible作为元标记,或者像default这样包含default.cshtml:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

这种技术最容易实现,特别是在共享主机上,您可能无法轻松调整IIS设置。可以找到关于stackoverflow的一个很好的讨论here