ASP.NET MVC 3:在发送HTTP标头后,服务器无法追加标头
我们正忙着使用3.5框架将ASP.NET MVC 2应用程序升级到在4.0框架上运行的ASP.NET MVC 3应用程序.
有一个页面在使用浏览器后退按钮接近时抛出异常.为了支持此页面上的浏览器后退按钮,我们实现了一个系统,该系统在返回页面时会重新请求该页面的结果.我没有明确的迹象表明在哪里寻找问题,因为我总是只找到错误 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,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标头已经发送了? 先感谢您, 编辑: [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) 还有一个Exception在我发布的异常之前被抛出(我只是错过了它,因为我迟到了).这个例外是: 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) 那我该怎么做呢? 解决方法
如果在页面上关闭了缓冲,则会发生这种情况.缓冲意味着asp.net在发送响应之前等待整个请求完成.这意味着可以随时更改标题.当缓冲关闭时,输出将在生成时发送到客户端.因此,您无法随意更改标头,因为它们已经发送过.
从您的堆栈跟踪,它似乎是一个异步控制器&我想知道这是否与它有关.我只是猜测你发布了什么. 更新 更正,异步提及实际上是框架代码&与您的代码无关.但是从上面的代码中,SearchResultOverview是否在控制器上执行了操作?如果是这样,那么使用你用来转移执行的方法是我认为你的问题的原因. 它导致2个mvchandlers执行&他们互相干扰.路由是重定向请求的更好方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何锁定ASP.NET MVC中的路径?
- ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发
- asp.net-mvc – 当可观察数组为空时如何显示无数据?
- 使用Openiddict的ASP.NET Core 1.0 OAuth服务器
- asp.net-mvc – 在ASP.NET MVC应用程序中使用Entity Framew
- asp.net-mvc – 使用JSON,JQuery向ASP.NET MVC Controller发
- 使用异步页面的ASP.NET中彗星更容易吗?
- 动手造轮子:实现简单的 EventQueue
- asp.net-mvc – MVC中SelectlistItem的自定义属性
- asp.net – 使用div标签在一行上的两个元素?
- MVC 5远程验证
- asp.net – 配置节“system.servicemodel”无法读
- oauth-2.0 – 连接Auth令牌并将其传递给启用了CO
- 用于访问所选ASP.NET复选框的jQuery选择器
- asp.net-mvc – 何时将MVC视图拆分为两个?
- asp.net-mvc – MVC 4忽略DefaultModelBinder.Re
- asp.net – WCF:是否有一个属性要在OperationCo
- asp.net-mvc – 在asp.net MVC中授权属性和jquer
- asp.net-mvc – ASP.NET MVC Validation将类添加
- asp.net – MVC 5使用旧表单身份验证而不是OWIN