我正在向页面添加标题,如下所示:
Page.Response.AddHeader("foo", "bar");
根据之前的处理,有时会失败并显示“服务器无法在发送 HTTP 标头后附加标头”。 我通过将
Page.Response.AddHeader("foo", "bar");
包含在 try
-catch
构造中来处理这个问题。 但是,为了使事情保持干净并避免生成异常,是否有任何方法可以检测标头是否已发送? (顺便说一句,如果我尝试评估 Page.Response.Headers
然后我会收到以下错误:“此操作需要 IIS 集成管道模式”)
谢谢
从 .NET 4.5.2 开始,您可以使用
HeadersWritten
的现已公开的 HttpResponse
属性来执行此操作(请参阅 msdn 文档):
if (HttpContext.Current.Response.HeadersWritten) { ... }
您可以使用 HttpModule 来注册 PreSendRequestHeaders 事件。 当它被调用时,向 HttpContext.Current.Items 写入一个值,指示标头正在发送 - 然后在代码中的其他位置检查 HttpContext.Current.Items 中的值以查看其是否已发送。
更新:HeadersWritten 属性现在可在 HttpResponse 对象上使用。
不幸的是,虽然 HttpResponse 对象有一个名为 HeadersWritten 的属性和一个名为 _headersWritten 的支持字段,但这些都无法从 System.Web 程序集外部访问 - 除非您使用反射。我不清楚您认为您能够从 headers 集合中获取什么,它可能存在也可能不存在,与 headers 是否已发送无关。
如果您想使用反射,它可能会带来自身的性能损失,并且需要您的应用程序以完全信任的方式运行。
HttpResponse 上涉及 _headersWritten 字段的所有可公开访问的方法似乎都使用它来引发异常。
尝试将缓冲区设置为 false:
http://msdn.microsoft.com/en-us/library/950xf363.aspx
这将缓解您的第一个问题,但您的性能和用户体验可能会受到影响。 此外,“此操作需要 IIS 集成管道模式”与处理该代码行的非 IIS 7 服务器有关。您可以在这里找到更多信息: