我们正在忙于将一个使用3.5框架的ASP.NET MVC 2应用程序升级为在4.0框架上运行的ASP.NET MVC 3应用程序。
有一个页面,当使用浏览器返回按钮时会抛出异常。为了支持该页面的浏览器返回按钮,我们实现了一个系统,在返回该页面时重新请求该页面的结果。然而,我没有明确的迹象可以查找问题,因为我总是只能找到错误。
带有堆栈跟踪
当我查找TransferRequest方法时,我发现它“执行指定URL的异步操作并保留查询字符串参数。”(http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transferrequest.aspx)
此外,在我发布的异常之前,还会抛出一个异常(由于我晚了捕获异常,所以我忽略了它)。这个异常是:
那么我该怎么让它工作?
有一个页面,当使用浏览器返回按钮时会抛出异常。为了支持该页面的浏览器返回按钮,我们实现了一个系统,在返回该页面时重新请求该页面的结果。然而,我没有明确的迹象可以查找问题,因为我总是只能找到错误。
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方法时,我发现它“执行指定URL的异步操作并保留查询字符串参数。”(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)
那么我该怎么让它工作?
at System.Web.Mvc.MvcHandler.AddVersionHeader(HttpContextBase httpContext)
,这意味着MVC本身正在尝试添加一个标题,但它不能。我尝试了你给我链接问题的解决方案response.BufferOutput = true
,但它不起作用。我总是收到这个异常和堆栈跟踪。 - IvanLServer.TransferRequest()
。然而,当浏览器返回按钮时,这种方法似乎不起作用...(当页面定期加载时,它完美地工作) - IvanL