Jesteśmy zajęci aktualizacją aplikacji ASP.NET MVC 2 przy użyciu frameworka 3.5 do aplikacji ASP.NET MVC 3 działającej w środowisku 4.0.ASP.NET MVC 3: Serwer nie może dołączyć nagłówka po wysłaniu nagłówków HTTP
Istnieje strona, która zgłasza wyjątek po zbliżeniu za pomocą przycisku Wstecz przeglądarki. Aby obsłużyć przycisk wstecz przeglądarki na tej stronie, zaimplementowaliśmy system, który odsyła wyniki na tej stronie od nowa po powrocie na stronę. I nie mają wyraźnego wskazania, gdzie szukać problemu jednak od zawsze tylko znaleźć błąd
Server cannot append header after HTTP headers have been sent.
Z stacktrace
at System.Web.HttpResponse.AppendHeader(String name, String value)
at System.Web.HttpResponseWrapper.AppendHeader(String name, String value)
at System.Web.Mvc.MvcHandler.AddVersionHeader(HttpContextBase httpContext)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2()
at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Jak to nagłówki HTTP już zostały wysłane?
Dziękuję z góry, IvanL
EDIT: dodaję nowe informacje i wgląd otrzymałem podczas polowania na ten problem. Administrator Asynch wspomina o jednej z odpowiedzi, która mnie zastanowiła. Kiedy okazało się, że musiałem zmienić następujące do starej metody MVC2 pracować:
[HttpPost, ValidateInput(false)]
public void SearchResultOverview(SearchResultViewModel model, string searchUrl)
{
if (!string.IsNullOrEmpty(searchUrl))
{
searchUrl = searchUrl.Replace("SearchPartial", "SearchPartialInternal");
//NOTE MVC 3
HttpContext.Server.TransferRequest(searchUrl, true);
//NOTE MVC 2
//System.Web.HttpContext.Current.RewritePath(searchUrl, false);
//IHttpHandler httpHandler = new MvcHttpHandler();
//// Process request
//httpHandler.ProcessRequest(System.Web.HttpContext.Current);
}
}
kiedy spojrzał metodę TransferRequest odkryłem, że Performs an asynchronous execution of the specified URL and preserves query string parameters.
(http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transferrequest.aspx)
Ponadto istnieje istota Wyjątek wyrzucony przed wyjątkiem, który napisałem (po prostu przegapiłem go, ponieważ wycofałem się z wyjątku późno). Ten wyjątek to:
The SessionStateTempDataProvider class requires session state to be enabled.
at System.Web.Mvc.SessionStateTempDataProvider.SaveTempData(ControllerContext controllerContext, IDictionary`2 values)
at System.Web.Mvc.TempDataDictionary.Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
at System.Web.Mvc.Controller.PossiblySaveTempData()
at System.Web.Mvc.Controller.ExecuteCore()
at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
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.<>c__DisplayClasse.<EndProcessRequest>b__d()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Jak mogę to wykonać?
Cóż, pozwól mi zobaczyć, czy mogę wywnioskować to psychicly ... ... ... hmm .. nope .. będziesz musiał dostarczyć jakiś kod. Jakie nagłówki dodajesz i kiedy? –
Może to pomoże: http://stackoverflow.com/questions/2383169/server-cannot-set-status-after-http-headers-have-been-sent-iis7-5 –
@Mystere Man: Właśnie o to chodzi. Sam nie dołączam żadnych nagłówków, wydaje się, że zmiana z MVC2 na MVC3 stworzyła ten problem, ponieważ kod działa poprawnie bez żadnych wyjątków w MVC2. Jeśli spojrzysz na stacktrace, zauważysz: 'w System.Web.Mvc.MvcHandler.AddVersionHeader (HttpContextBase httpContext)' co oznacza, że MVC próbuje dodać nagłówek, ale nie może tego zrobić. Próbowałem rozwiązać pytanie, które łączyłeś mnie z 'reponse.BufferOutput = true', ale to nie działa. Zawsze otrzymuję ten wyjątek i stacktrace. – IvanL