代码之家  ›  专栏  ›  技术社区  ›  Tom Kidd

如何判断在asp.net应用程序中何时发送了http头?

  •  14
  • Tom Kidd  · 技术社区  · 15 年前

    长话短说,我有一个正在调试的asp.net应用程序,在某些特定情况下,该应用程序将在 Response.Redirect() 陈述:

    "Cannot redirect after HTTP headers have been sent."
    

    我或多或少得到了,只是我搞不懂 哪里 邮件头已发送。

    在一个asp.net应用程序中,是否有什么东西可以指示http头已发送?

    奖励难度: ASP.NET应用程序仍在.NET 1.1中。升级背后的延迟是一个非常棘手的问题。

    2 回复  |  直到 8 年前
        1
  •  16
  •   Samuel Neff    8 年前

    HttpApplication 有一件事 PreSendRequestHeaders 当头被写入时调用。订阅并记录它或添加断点。

    除此之外, HttpResponse 有一个 内部的 调用的属性 HeadersWritten ( _headersWritten .NET 1.1中的字段)。因为它是内部的,你不能直接访问它,但你可以通过反射。如果这只用于内部调试(即,不是生产代码),那么使用反射就可以了。

    在所有页面生命周期事件之前/之后检查此方法。一旦您知道哪个事件正在写出标题,请添加更多 头像 查一下他们是在哪里写的。通过逐步缩小对此属性的检查范围,您将发现它。

    新信息

    头像 属性是公共的,从.NET 4.5.2开始

        2
  •  5
  •   Ben Gripka Javed Akram    8 年前

    塞缪尔的回答帮我解决了这个问题(+1)。我不能在注释中粘贴代码示例,但为了帮助其他人,下面是我如何使用他建议的事件向我的ihttphandler添加headerswrite属性:

    protected bool HeadersWritten { get; private set; }
    
    void ApplicationInstance_BeginRequest(object sender, EventArgs e)
    {
        HeadersWritten = false;
    }
    
    void ApplicationInstance_PreSendRequestHeaders(object sender, EventArgs e)
    {
        HeadersWritten = true;
    }
    
    public void ProcessRequest(HttpContextBase context)
    {
        context.ApplicationInstance.PreSendRequestHeaders += new EventHandler(ApplicationInstance_PreSendRequestHeaders);
        do_some_stuff();
    }
    

    在我的代码中,如果我太晚才处理头,就会中断,我只需先检查headerswrited属性:

    if (!HeadersWritten)
    {
        Context.Response.StatusDescription = get_custom_description(Context.Response.StatusCode);
    }