Исключение, генерируемое в end_request при добавлении заголовков - PullRequest
3 голосов
/ 26 августа 2011

Иногда я получаю это исключение (для просмотра в 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 ]

2 голосов
/ 26 августа 2011

Application_BeginRequest было бы лучшим местом для этого. Если, возможно, у вас в приложении нет какой-то причины ждать до конца, хотя в общих случаях я не могу придумать вескую причину.

Если вы действительно хотите сохранить его в Application_EndRequest, вы можете включить буферизацию вывода (Response.BufferOutput = true; где-то раньше, как в Page_Load), чтобы заголовки не отправлялись до тех пор, пока запрос не будет полностью обработан. Однако есть свои плюсы и минусы для буферизации вывода, поэтому обязательно прочитайте об этом, если хотите попробовать.

0 голосов
/ 27 июля 2015

Для удобства приземления здесь есть еще один способ добавления X-UA-Compatible (или любого другого такого заголовка).Вы также можете включить X-UA-Compatible в качестве метатега на своей главной странице ИЛИ default.cshtml, например, так:

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

Этот метод проще всего реализовать, особенно на виртуальном хостинге, где вы не сможетеслишком легко изменять настройки IIS.Отличное обсуждение стекопотока можно найти здесь .

...