首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >发送HTTP标头IIS7.5后,服务器无法设置状态

发送HTTP标头IIS7.5后,服务器无法设置状态
EN

Stack Overflow用户
提问于 2010-03-05 06:21:54
回答 10查看 149.3K关注 0票数 72

有时我会在我的生产环境中遇到异常:

网络信息

  • 进程ID: 3832
  • 进程名: w3wp.exe
  • 帐户名: NT AUTHORITY\NETWORK SERVICE

  • Exception信息

  • 异常类型: System.Web.HttpException
  • 异常消息:HTTP头发送后,服务器无法设置状态。 HTTP

  • Request信息

    H144已通过身份验证: True

    • Authentication类型: Forms
    • 线程帐户名: NT AUTHORITY\NETWORK SERVICE

  • Thread information

  • 线程ID: 10
  • 线程帐户名称: NT AUTHORITY\NETWORK SERVICE
  • Is impersonating: False NETWORK

代码语言:javascript
复制
Stack trace: at System.Web.HttpResponse.set_StatusCode(Int32 value) at  
System.Web.HttpResponseWrapper.set_StatusCode(Int32 value) at  
System.Web.Mvc.HandleErrorAttribute.OnException(ExceptionContext filterContext) at  
System.Web.Mvc.ControllerActionInvoker.InvokeExceptionFilters(ControllerContext controllerContext, IList(1) filters, Exception exception) at  
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at  
System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4() 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.EndProcessRequest(IAsyncResult asyncResult) at  
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at  
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& ompletedSynchronously) 

我在我的测试环境中没有注意到这个错误,我应该检查什么?

我正在使用ASP.NET MVC 2 (Release Candidate 2)

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-05-24 01:03:55

我大体上同意Vagrant的观点:

  1. 您的操作正在执行,正在将标记写入响应流
  2. 流未缓冲强制在标记写入之前写入响应头。
  3. 您的视图遇到运行时error
  4. Exception处理程序开始尝试将状态代码设置为其他值-200
  5. 失败,因为标头已经发送。

我不同意Vagrant的是“在绑定中没有错误”的补救方法--你仍然可能在视图绑定中遇到运行时错误,例如空引用异常。

一种更好的解决方案是确保在将任何字节发送到响应流之前使用Response.BufferOutput = true;。例如,在您的控制器操作或应用程序中的On_Begin_Request中。这使得服务器传输、cookies/标头等可以直接设置到自然结束响应或调用end/flush。

当然,还要检查buffer在堆栈中是否也没有被刷新/设置为false。

MSDN参考:HttpResponse.BufferOutput

票数 64
EN

Stack Overflow用户

发布于 2010-10-27 11:10:09

只是为了补充上面的回答。当我第一次开始使用ASP.Net MVC时,我遇到了同样的问题,我在控制器操作期间执行Response.Redirect:

代码语言:javascript
复制
Response.Redirect("/blah", true);

我应该返回一个RedirectAction,而不是返回Response.Redirect操作

代码语言:javascript
复制
return Redirect("/blah");
票数 51
EN

Stack Overflow用户

发布于 2010-05-20 01:36:25

在您指定错误或开始发送数据之前,HTTP服务器不会将响应头发送回客户端。如果您开始将数据发送回客户端,则服务器必须首先发送响应头(其中包含状态代码)。一旦发送了报头,显然就不能再在报头中放入状态代码。

这是一个常见的问题。启动页面,并发送一些初始标记(即<head>)。然后,服务器在首先发送带有假定成功状态的HTTP响应头之后,将这些标记发送到客户端。现在,您开始处理页面的主要部分,并发现一个问题。此时不能发送错误,因为包含错误状态的响应头已经发送。

解决方案是这样的:在生成任何内容之前,检查是否会有任何错误。只有这样,当你确信不会有任何问题时,你才能开始发送内容,比如标签。

在您的示例中,您似乎有一个处理来自表单的POST请求的登录页面。您可能会抛出一些初始HTML,然后检查用户名和密码是否有效。相反,在生成任何HTML之前,您应该首先验证用户/密码。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2383169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档