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

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

  • Информация о процессе
    • Идентификатор процесса: 3832
    • Имя процесса: w3wp.exe
    • Имя учетной записи: УСЛУГИ NT AUTHORITY\NETWORK
  • Информация об исключении
    • Тип исключительной ситуации: Система. Сеть. HttpException
    • Сообщение об исключении: Сервер не может установить состояние после того, как HTTP-заголовки были отправлены.
  • Запросите информацию
    • URL запроса: http://www.myulr.pl/logon
    • Путь запроса: / вход в систему
    • Пользовательский адрес узла: 10.11.9.1
    • Пользователь: user001
    • Аутентифицируется: Верный
    • Тип аутентификации: формы
    • Имя учетной записи потока: УСЛУГИ NT AUTHORITY\NETWORK
  • Информация о потоке
    • Идентификатор потока: 10
    • Имя учетной записи потока: УСЛУГИ NT AUTHORITY\NETWORK
    • Является олицетворением: Ложь
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.b__4() at  
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0() at  
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8(1).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 (Предвыпускная версия 2)

69
задан Joel Coehoorn 18 November 2011 в 05:15
поделиться

3 ответа

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

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

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

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

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

Ссылка MSDN: HttpResponse.BufferOutput

59
ответ дан 24 November 2019 в 13:45
поделиться

Я помню часть этого исключения: "Cannot modify header information - headers already sent by", возникающего в PHP. Оно возникало, когда заголовки уже были отправлены на этапе перенаправления и генерировался любой другой вывод, например:

echo "hello"; header("Location:http://stackoverflow.com");

Извините и поправьте меня, если я не прав, но я все еще изучаю технологии MS и пытался помочь.

1
ответ дан 24 November 2019 в 13:45
поделиться

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

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

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

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

15
ответ дан 24 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: