ASP.NET MVC 3: le Serveur ne peut pas ajouter l'en-tête après les en-têtes HTTP ont été envoyés

Nous sommes occupés de la mise à niveau d'un ASP.NET MVC 2 Application à l'aide du framework 3.5 pour un ASP.NET MVC 3 Application en cours d'exécution sur le framework 4.0.

Il y a une page qui déclenche une exception lorsqu'il est sollicité en utilisant le bouton précédent du navigateur. Pour appuyer le bouton précédent du navigateur sur cette page, nous avons mis en place un système qui demande les résultats de la page à nouveau lors de l'arrivée de nouveau sur la page. Je n'ai pas d'indications claires où chercher le problème, toutefois, depuis que je suis toujours seul à trouver l'erreur

Server cannot append header after HTTP headers have been sent.

Avec 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)

Comment se les en-têtes HTTP ont déjà été envoyés?

Vous en remercie d'avance,
IvanL

EDIT:
Je suis de l'ajout de nouvelles informations et idées que j'ai acquise pendant la chasse pour ce problème. Le Asynch Contrôleur mention de l'une des réponses que m'a demande. Quand j'ai découvert que je devais changer les données suivantes pour le vieux MVC2 méthode de travail:

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

Quand j'ai regardé la TransferRequest méthode, j'ai trouvé qu'il 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 )

Il y a aussi une Exception levée avant l'exception que j'ai posté (j'ai simplement manqué de il depuis que j'ai intercepté la fin de l'exception). Cette exception est:

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)

Alors, comment dois-je faire ce travail?

Eh bien, permettez-moi de voir si je peux en déduire ce psychicly... ... ... euh.. nan.. vous allez avoir à fournir un peu de code. Ce que les en-têtes sont vous concaténation, et quand?
Peut-être cela va aider: stackoverflow.com/questions/2383169/...
L'homme: C'est exactement le point. Je ne suis pas en ajoutant tout les en-têtes de moi-même, il semble que le changement de MVC2 à MVC3 créé ce problème étant donné que le code fonctionne très bien sans aucune exception dans MVC2. Si vous regardez dans le stacktrace vous avis: at System.Web.Mvc.MvcHandler.AddVersionHeader(HttpContextBase httpContext) qui signifie MVC lui-même est d'essayer d'ajouter un en-tête, mais il ne peut pas. J'ai essayé la solution de la question que vous me lie avec reponse.BufferOutput = true mais il ne fonctionne pas. Je reçois toujours de cette exception et stacktrace.
Pourquoi êtes-vous créer un nouveau HttpHandler à l'intérieur d'une méthode d'action?
Salon de coiffure: Cela a été fait pour gérer de grandes Url. La chaîne searchUrl est l'URL réelle, mais il est tellement grand que certains navigateurs refusent de travailler avec elle. Pour contourner cela, l'URL a été effectivement publié et traitées en interne. Dans MVC 2 cela a été fait par le tir d'un nouveau requesthandler et de le laisser gérer l'URL réelle, depuis MVC 3 ce n'est plus possible et la solution que j'ai trouvé pour cela est d'utiliser Server.TransferRequest(). Il semble cependant que cette méthode ne fonctionne pas lorsqu'il est sollicité par le bouton précédent du navigateur... (il fonctionne parfaitement lorsque la page est régulièrement chargé)

OriginalL'auteur IvanL | 2011-12-14