加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET MVC 3:在发送HTTP标头后,服务器无法追加标头

发布时间:2020-12-16 03:26:44 所属栏目:asp.Net 来源:网络整理
导读:我们正忙着使用3.5框架将ASP.NET MVC 2应用程序升级到在4.0框架上运行的ASP.NET MVC 3应用程序. 有一个页面在使用浏览器后退按钮接近时抛出异常.为了支持此页面上的浏览器后退按钮,我们实现了一个系统,该系统在返回页面时会重新请求该页面的结果.我没有明确
我们正忙着使用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标头已经发送了?

先感谢您,
IvanL

编辑:
我正在寻找我在寻找此问题时获得的新信息和洞察力. Asynch Controller提到的其中一个答案让我感到疑惑.当我发现我必须为旧的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)

还有一个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执行&他们互相干扰.路由是重定向请求的更好方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读