我們正在忙於使用3.5框架將ASP.NET MVC 2應用程序升級到運行在4.0框架上的ASP.NET MVC 3應用程序。ASP.NET MVC 3:服務器在發送HTTP標頭後無法追加標頭
有一個頁面在使用瀏覽器後退按鈕接近時引發異常。爲了支持此頁面上的瀏覽器後退按鈕,我們實現了一個系統,該頁面返回時重新請求該頁面的結果。我還沒有明確的跡象表明在哪裏尋找問題然而,由於我總是隻發現錯誤
Server cannot append header after HTTP headers have been sent.
隨着堆棧跟蹤
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)
怎麼會在HTTP標頭已經被髮送?
謝謝你在前進, IvanL
編輯: 我加入新的信息和見解,我獲得了當尋找這個問題。異步控制器提到了其中一個答案讓我想知道。當我發現我不得不改變舊MVC2方法如下工作:
[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);
}
}
當我擡頭看TransferRequest方法我發現它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)
也有一個例外是在我發佈的例外之前拋出(我只是錯過了它,因爲我遲到了這個例外)。這個例外是:
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)
那麼我該怎麼做這項工作?
嗯,讓我看看,如果我可以推斷出這個psychicly ... ... ...呃..沒了..你將不得不提供一些代碼。什麼標題你追加,什麼時候? – 2011-12-14 17:42:35
也許這將幫助: http://stackoverflow.com/questions/2383169/server-cannot-set-status-after-http-headers-have-been-sent-iis7-5 – 2011-12-14 17:46:43
@Mystere人:這就是要點。我不是自己添加任何頭文件,似乎從MVC2更改爲MVC3創建此問題,因爲代碼運行良好,沒有任何MVC2例外。如果你看一下堆棧跟蹤,你會發現:`在System.Web.Mvc.MvcHandler.AddVersionHeader(HttpContextBase httpContext)`這意味着MVC本身試圖添加一個頭,但它不能。 我確實試過了你用`reponse.BufferOutput = true`連接了我的問題的解決方案,但它不起作用。我總是收到這個異常和堆棧跟蹤。 – IvanL 2011-12-15 09:33:22