偶尔我会抛出这个异常(在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看起来很奇怪,但每个使用它的人都把它放在这里。
答案 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。