【问题标题】:Detect that asp.net http headers already sent检测已发送的 asp.net http 标头
【发布时间】:2021-02-03 16:01:27
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 用于缓存使用 Page.Response.Cache
  • 我以前见过这个。您需要说明您正在使用哪些技术:缓存、AJAX、MVC ......以及您在代码中的何处添加此标头以便我们提供帮助。

标签: asp.net http header


【解决方案1】:

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

【讨论】:

  • 看起来这可能解决了我们遇到的同样问题。谢谢!
  • 如果您能够切换到 .NET 4.5.2,您应该改用 HttpResponseBase.AddOnSendingHeaderslink
【解决方案2】:

从 .NET 4.5.2 开始,您可以使用 HttpResponse 的现已公开的 HeadersWritten 属性来执行此操作(请参阅 the msdn docs):

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

【讨论】:

    【解决方案3】:

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

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

    如果您想使用反射,它可能会有自己的性能损失,并且需要您的应用程序在完全信任的情况下运行。

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

    【讨论】:

    【解决方案4】:

    尝试将缓冲区设置为 false:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多