Siamo impegnati nell'aggiornamento di un'applicazione ASP.NET MVC 2 utilizzando il framework 3.5 a un'applicazione ASP.NET MVC 3 in esecuzione sul framework 4.0.ASP.NET MVC 3: il server non può aggiungere l'intestazione dopo che le intestazioni HTTP sono state inviate
C'è una pagina che genera un'eccezione quando ci si avvicina utilizzando il pulsante Indietro del browser. Per supportare il pulsante Indietro del browser su questa pagina abbiamo implementato un sistema che richiede nuovamente i risultati per quella pagina quando si ritorna sulla pagina. Non ho indicazioni chiare dove cercare per il problema comunque dato che ho sempre e solo trovare l'errore
Server cannot append header after HTTP headers have been sent.
Con 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)
Come mai le intestazioni HTTP già sono stati inviati?
Grazie in anticipo, IvanL
EDIT: sto aggiungendo nuove informazioni e intuizione ho guadagnato durante la caccia per questo problema. Il nominativo di Asynch Controller di una delle risposte mi ha fatto riflettere. Quando ho scoperto che ho dovuto cambiare quanto segue per il vecchio metodo MVC2 a lavorare:
[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);
}
}
Quando ho guardato il metodo TransferRequest ho trovato che 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)
Inoltre v'è un essere Eccezione gettato prima dell'eccezione che ho postato (mi sono semplicemente perso perché ho fatto tardi l'eccezione). Questa eccezione è:
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)
Così come faccio a fare questo lavoro?
Bene, vediamo se posso dedurre questo psychicly ... ... ... umm .. no .. si sta andando ad avere per fornire un certo codice. Quali intestazioni stai aggiungendo e quando? –
Forse questo aiuterà: http://stackoverflow.com/questions/2383169/server-cannot-set-status-after-http-headers-have-been-sent-iis7-5 –
@Mystere Man: Questo è esattamente il punto. Non aggiungo intestazioni personali, sembra che il passaggio da MVC2 a MVC3 abbia creato questo problema poiché il codice funziona correttamente senza eccezioni in MVC2. Se si guarda nello stacktrace si nota: 'su System.Web.Mvc.MvcHandler.AddVersionHeader (HttpContextBase httpContext)' il che significa che MVC stesso sta cercando di aggiungere un'intestazione, ma non può. Ho provato la soluzione della domanda che mi hai collegato con 'reponse.BufferOutput = true' ma non funziona. Ricevo sempre questa eccezione e stacktrace. – IvanL