Сервер не может установить статус после отправки заголовков HTTP IIS7.5

Иногда я получаю исключение в моей производственной среде:

  • Process information
    • Process ID: 3832
    • Имя процесса: w3wp.exe
    • Имя учетной записи: NT AUTHORITY \ NETWORK SERVICE
  • Exception information
    • Exception type: System.Web.HttpException
    • Сообщение об исключении: Сервер не может установить статус после отправки заголовков HTTP.
  • Request information
    • Request URL: http://www.myulr.pl/logon
    • Путь запроса: / logon
    • Адрес хоста пользователя: 10.11.9.1
    • Пользователь: user001
    • Подтверждено: True
    • Тип аутентификации: формы
    • Имя учетной записи потока: NT AUTHORITY \ NETWORK SERVICE
  • Thread information
    • Thread ID: 10
    • Имя учетной записи потока: NT AUTHORITY \ NETWORK SERVICE
    • Выдает себя за другое лицо: False
Stack trace: at System.Web.HttpResponse.set_StatusCode(Int32 value) at  
System.Web.HttpResponseWrapper.set_StatusCode(Int32 value) at  
System.Web.Mvc.HandleErrorAttribute.OnException(ExceptionContext filterContext) at  
System.Web.Mvc.ControllerActionInvoker.InvokeExceptionFilters(ControllerContext controllerContext, IList(1) filters, Exception exception) at  
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at  
System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4() at  
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() at  
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8(1).<BeginSynchronous>b__7(IAsyncResult _) at  
System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult(1).End() at   
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) at  
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at  
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& ompletedSynchronously) 

Я не заметил эту ошибку в своей тестовой среде, что мне проверить?

Я использую ASP.NET MVC 2 (Release Candidate 2)


person marcinn    schedule 04.03.2010    source источник
comment
Это тоже происходит со мной. Ошибка исходит из атрибута HandleErrorAttribute, как и в вашем случае.   -  person Gabe Moothart    schedule 08.04.2010
comment
Удалось ли вам решить эту проблему?   -  person Azho KG    schedule 15.05.2010
comment
У меня была такая же проблема с тех пор, как я переключился на MVC 2. Также при настройке файлов cookie аналогичная ошибка не может возникнуть после отправки заголовков. Мне любопытен ответ. В моем случае переключение между http / https, похоже, играет роль.   -  person Matt Sherman    schedule 20.05.2010
comment
Я обнаружил, что пытался перенаправить пользователя в Actionfilter (OnActionExecuting) - это была проблема   -  person marcinn    schedule 03.06.2011


Ответы (10)


Я в целом согласен с Бродягой по поводу причины:

  1. ваше действие выполнялось, разметка записывалась в поток ответов
  2. поток был небуферизован, поэтому заголовки ответов записывались до того, как могла начаться запись разметки.
  3. Ваше представление обнаружило ошибку времени выполнения
  4. Обработчик исключений пытается установить код состояния на что-то другое, отличное от 200
  5. Ошибка, потому что заголовки уже отправлены.

Если я не согласен с Vagrant, это средство «не вызывать ошибок в привязке» - вы все равно можете столкнуться с ошибками времени выполнения в привязке View, например. исключения нулевой ссылки.

Лучшее решение для этого - убедиться, что Response.BufferOutput = true; перед отправкой любых байтов в поток ответа. например в действии вашего контроллера или On_Begin_Request в приложении. Это позволяет передавать серверы, устанавливать файлы cookie / заголовки и т. Д. Вплоть до естественного завершения ответа или вызова end / flush.

Конечно, также проверьте, не сбрасывается ли буфер / не устанавливается ли значение false и в дальнейшем в стеке.

Ссылка MSDN: HttpResponse.BufferOutput

person Community    schedule 23.05.2010
comment
Я получаю ту же ошибку, но в моем случае это происходит, когда я пытаюсь вызвать дочернее действие. Я попытался установить Response.BufferOutput = true в начале родительского действия, но это не помогло. Любые идеи? - person Samo; 18.02.2011
comment
Само, где-то раньше в вашем коде что-то записывает байты в поток ответа, установите буферизацию mu в начале обработки запроса, например. прежде, чем вы позволите вашему Action начаться в вашем контроллере. - person stephbu; 20.02.2011
comment
Как использовать HttpResponse.BufferOutput в контроллере MVC? - person Kiquenet; 14.03.2019
comment
В моем контроллере действий индекса у меня есть: [HttpPost] и [ValidateAntiForgeryToken] - person Kiquenet; 14.03.2019
comment
(Предполагая, что вы говорите о System.Web.Mvc.Controller) Контроллер имеет аксессор Response, чтобы предоставить доступ к объекту HttpResponse для текущего контекста HTTP-запроса. Таким образом, в методах контроллера допустимо следующее: this.Response.BufferOutput - person stephbu; 15.03.2019

Просто чтобы добавить к ответам выше. У меня была такая же проблема, когда я впервые начал использовать ASP.Net MVC и делал Response.Redirect во время действия контроллера:

Response.Redirect("/blah", true);

Вместо того, чтобы возвращать действие Response.Redirect, я должен был возвращать RedirectAction:

return Redirect("/blah");
person Doug    schedule 27.10.2010
comment
Спасибо, я проделал то же самое со своим фильтром. Изменил это, и это было исправлено ... // Помощник по URL для генерации URL перенаправления. UrlHelper urlHelper = новый UrlHelper (filterContext.RequestContext); filterContext.Result = новый RedirectResult (urlHelper.Action (ActionNames.Index, ControllerNames.CustomerSearch, новый {Area =})); // в конце base.OnActionExecuting (filterContext); - person learning...; 24.04.2012
comment
У меня была аналогичная проблема с клиентом .NET CAS, и этот ответ подсказал мне мою проблему. По сути, я возвращал ответ «дважды», вызывая CasAuthentication.SingleSignOut (); за которым следует RedirectToAction (). Очевидно, в этом нет смысла - как вы можете перенаправить дважды, не так ли? Но тогда я этого не осознавал. Я изменил свой возвращаемый тип действия LogOut с ActionResult на void, избавился от Redirect, и проблема была решена. Спасибо! - person Pandincus; 17.08.2012

HTTP-сервер не отправляет заголовок ответа обратно клиенту, пока вы не укажете ошибку или не начнете отправлять данные. Если вы начнете отправлять данные обратно клиенту, то сервер должен сначала отправить заголовок ответа (который содержит код состояния). Очевидно, что после отправки заголовка вы больше не можете помещать код статуса в заголовок.

Вот обычная проблема. Вы запускаете страницу и отправляете несколько начальных тегов (например, <head>). Затем сервер отправляет эти теги клиенту после первой отправки заголовка ответа HTTP с предполагаемым статусом УСПЕХ. Теперь вы начинаете работать над основной частью страницы и обнаруживаете проблему. Вы не можете отправить сообщение об ошибке на этом этапе, потому что заголовок ответа, который будет содержать статус ошибки, уже отправлен.

Решение заключается в следующем. Прежде чем создавать какое-либо содержание, проверьте, не возникнут ли ошибки. Только тогда, когда вы убедились, что проблем не возникнет, вы можете начать отправлять контент, например тег.

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

person Vagrant    schedule 19.05.2010

Как насчет проверки этого перед перенаправлением:

if (!Response.IsRequestBeingRedirected)
{
   //do the redirect
}
person Sandeep    schedule 18.01.2012

У меня была такая же проблема с установкой StatusCode, а затем Response.End в HandleUnauthorizedRequest методе AuthorizeAttribute

var ctx = filterContext.HttpContext;
ctx.Response.StatusCode = (int)HttpStatusCode.Forbidden;
ctx.Response.End();

Если вы используете .NET 4.5+, добавьте эту строку перед Response.StatusCode

filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

Если вы используете .NET 4.0, попробуйте SuppressFormsAuthenticationRedirectModule.

person VahidN    schedule 07.05.2014

На самом деле вы пытаетесь перенаправить страницу, на которую нужно бросить какой-то ответ. Итак, сначала вы сохраняете информацию, которую вы добавили в буфер, используя response.buffer = true в начале страницы, а затем сбрасываете ее, когда это необходимо, используя response.flush, эта ошибка будет исправлена

person hema    schedule 26.04.2011

Я помню часть этого исключения: «Невозможно изменить информацию заголовка - заголовки уже отправлены» в PHP. Это произошло, когда заголовки уже были отправлены на этапе перенаправления и был сгенерирован любой другой вывод, например:

эхо "привет"; заголовок ("Местоположение: http://stackoverflow.com");

Простите меня и поправьте меня, если я ошибаюсь, но я все еще изучаю MS Technologies, и я пытался помочь.

person Adil Mehmood    schedule 21.05.2010

Прошу прощения, но я добавляю свои 2 цента в ветку на всякий случай, если у кого-то возникнет такая же проблема.

  • Я использовал проверку подлинности с помощью форм в своем приложении MVC
  • Но некоторые действия контроллера были «анонимными», т.е. разрешены неаутентифицированным пользователям.
  • Иногда в этих действиях я все еще хотел бы, чтобы пользователи перенаправлялись в форму входа при определенных условиях.
  • для этого - у меня есть это в моем методе действий: return new HttpStatusCodeResult(401) - и ASP.NET очень приятно это обнаруживать, и он перенаправляет пользователя на страницу входа! Магия, правда? У него даже есть правильный параметр ReturnUrl и т. Д.

Но вы видите, к чему я клоню? Я возвращаю 401. А ASP.NET перенаправляет пользователя. По сути, это возвращает 302. Один код состояния заменяется другим.

И некоторые серверы IIS (только некоторые!) Выдают это исключение. Некоторые этого не делают. - У меня его нет на моем тестовом серевре, только на моем производственном сервере (не всегда так, верно o_O)

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

person jazzcat    schedule 27.10.2016

Мы получали ту же ошибку - так что это может быть полезно для некоторых.

Для нас причина была очень простой. Изменение интерфейса сбило с толку конечного пользователя, и он нажал кнопку «Назад» в браузере в «плохое» время после отправки формы (конечно, мы должны были использовать шаблон PRG, но мы этого не сделали).

Мы исправили проблему, и пользователь больше не нажимает кнопку «Назад». Проблема решена.

person niico    schedule 20.09.2018

Если у кого-то все еще есть эта проблема, попробуйте использовать вместо оверрайдинга

 public void OnActionExecuting(ActionExecutingContext context)
    {
        try
        {

            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (!HttpContext.Current.Response.IsRequestBeingRedirected)
                {

                    context.Result = new RedirectToRouteResult(
                new RouteValueDictionary {  { "controller", "Login" }, { "action", "Index" } });
                }
            }

        }
        catch (Exception ex)
        {
               new RouteValueDictionary { { "controller", "Login" }, { "action", "Index" } });
        }

    }
person Emre    schedule 18.03.2018
comment
OnActionExecuting в контроллере? Фильтр? - person Kiquenet; 14.03.2019
comment
@Kiquenet в фильтре - person Emre; 15.03.2019