检测 asp.net http 标头已发送

问题描述 投票:0回答:4

我正在向页面添加标题,如下所示:

Page.Response.AddHeader("foo", "bar");

根据之前的处理,有时会失败并显示“服务器无法在发送 HTTP 标头后附加标头”。 我通过将

Page.Response.AddHeader("foo", "bar");
包含在
try
-
catch
构造中来处理这个问题。 但是,为了使事情保持干净并避免生成异常,是否有任何方法可以检测标头是否已发送? (顺便说一句,如果我尝试评估
Page.Response.Headers
然后我会收到以下错误:“此操作需要 IIS 集成管道模式”)

谢谢

asp.net http header
4个回答
15
投票

从 .NET 4.5.2 开始,您可以使用

HeadersWritten
的现已公开的
HttpResponse
属性来执行此操作(请参阅 msdn 文档):

if (HttpContext.Current.Response.HeadersWritten) { ... }

13
投票

您可以使用 HttpModule 来注册 PreSendRequestHeaders 事件。 当它被调用时,向 HttpContext.Current.Items 写入一个值,指示标头正在发送 - 然后在代码中的其他位置检查 HttpContext.Current.Items 中的值以查看其是否已发送。


7
投票

更新:HeadersWritten 属性现在可在 HttpResponse 对象上使用。

不幸的是,虽然 HttpResponse 对象有一个名为 HeadersWritten 的属性和一个名为 _headersWritten 的支持字段,但这些都无法从 System.Web 程序集外部访问 - 除非您使用反射。我不清楚您认为您能够从 headers 集合中获取什么,它可能存在也可能不存在,与 headers 是否已发送无关。

如果您想使用反射,它可能会带来自身的性能损失,并且需要您的应用程序以完全信任的方式运行。

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


0
投票

尝试将缓冲区设置为 false:

http://msdn.microsoft.com/en-us/library/950xf363.aspx

这将缓解您的第一个问题,但您的性能和用户体验可能会受到影响。 此外,“此操作需要 IIS 集成管道模式”与处理该代码行的非 IIS 7 服务器有关。您可以在这里找到更多信息:

http://forums.asp.net/p/1253457/2323117.aspx

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.