检测已发送的asp.net http标头

DEH*_*DEH 12 asp.net header http

我正在向页面添加标题,如下所示:Page.Response.AddHeader("foo","bar");

根据以前的处理,有时会失败,"服务器无法在发送HTTP标头后附加标头".我通过附上Page.Response.AddHeader("foo","bar")处理这个问题.在try-catch构造中.但是,为了保持清洁并避免生成异常,有没有办法检测标头是否已经发送?(顺便说一句,如果我尝试评估Page.Response.Headers然后我收到以下错误:"此操作需要IIS集成管道模式")

谢谢

Sco*_*man 13

您可以使用HttpModule注册PreSendRequestHeaders事件.当它被调用时,向HttpContext.Current.Items写一个值,表明正在发送标题 - 然后在代码中的其他地方检查HttpContext.Current.Items中的值,看看它是否已被发送.

  • 如果能够切换到.NET 4.5.2,则应使用`HttpResponseBase.AddOnSendingHeaders`.[链接](http://msdn.microsoft.com/en-us/library/system.web.httpresponsebase.addonsendingheaders.aspx) (2认同)

Cha*_*ion 10

从.NET 4.5.2开始,您可以使用now-public HeadersWritten属性HttpResponse(请参阅msdn docs):

if (HttpContext.Current.Response.HeadersWritten) { ... }
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 7

不幸的是,虽然HttpResponse对象有一个名为HeadersWritten的属性,以及一个名为_headersWritten的支持字段,但这些都不能从System.Web程序集外部访问 - 除非你使用Reflection.我不清楚你认为你能从Headers集合中获得什么,它可能存在也可能不存在,与标题是否已经发送无关.

如果您想使用Reflection,它可能会有自己的性能损失,并且它将要求您的应用程序以完全信任的方式运行.

HttpResponse上涉及_headersWritten字段的所有可公开访问的方法似乎都使用它来引发异常.

  • 与此同时 [.Net 自 Framework 4.5.2 起公开了 HeadersWritten](/sf/answers/2534462941/) (2认同)