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



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






  • информация о процессе


    • идентификатор процесса: 3832

    • имя процесса: w3wp.exe

    • имя учетной записи: NT AUTHORITYNETWORK SERVICE




  • сведения об исключении


    • тип исключения: System.Сеть.HttpException

    • сообщение об исключении:сервер не может установите статус после отправки заголовков HTTP.




  • запрос информации


    • URL запроса:http://www.myulr.pl/logon

    • путь запроса: / logon

    • адрес хоста пользователя: 10.11.9.1

    • пользователь: user001

    • прошел: True

    • Тип Аутентификации: Формы

    • имя учетной записи потока: NT AUTHORITYNETWORK Сервис




  • информация о потоке


    • идентификатор потока: 10

    • имя учетной записи потока: NT AUTHORITYNETWORK 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)

661   10  

10 ответов:

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

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

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

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

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

ссылка MSDN: HttpResponse.BufferOutput

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

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

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

return Redirect("/blah");

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

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

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

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

у меня была такая же проблема с настройкой 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.

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

if (!Response.IsRequestBeingRedirected)
{
   //do the redirect
}

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

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

Echo "привет"; заголовок ("Location:http://stackoverflow.com");

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

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

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

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

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

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

Если у кого-то все еще есть эта проблема.Попробуйте использовать вместо ovverriding

 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" } });
        }

    }

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

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

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

Comments

    Ничего не найдено.