如何在ASP.NET应用程序中发送HTTP标头时如何判断?

Tom*_*idd 15 c# asp.net http-headers

长话短说,我有一个ASP.NET应用程序,我正在尝试调试,在某些情况下,在非常特殊的情况下,应用程序将抛出异​​常Response.Redirect()表示:

"Cannot redirect after HTTP headers have been sent."
Run Code Online (Sandbox Code Playgroud)

我或多或少得到,但我想不通其中的头被送往.

是否有一些东西要在ASP.NET应用程序中查找,表明HTTP标头已被发送?

奖金难度: ASP.NET应用程序仍在.NET 1.1中.关于升级延迟的情况是一个非常痛苦的主题.

Sam*_*eff 18

HttpApplication有一个事件PreSendRequestHeaders,当标题写入时调用.订阅此并记录或添加断点.

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

在所有页面生命周期事件之前/之后检查此方法.一旦您知道哪个事件正在写出标题,请添加更多HeadersWritten检查以找出它们写入的位置.通过逐步缩小对该物业的支票,您将找到它.

新信息

HeadersWritten 财产是从.Net 4.5.2开始公开的

  • `HeadersWritten`属性是从.Net 4.5.2开始公开的 (2认同)

Joe*_* P. 5

塞缪尔的回答刚刚为我解决了这个问题(+1).我无法在评论中粘贴代码示例,但为了帮助其他人,我在这里使用他建议的事件来向我的IHTTPHandler添加HeadersWritten属性:

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();
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中,如果我把标题搞得太晚会破坏,我只需先检查HeadersWritten属性:

if (!HeadersWritten)
{
    Context.Response.StatusDescription = get_custom_description(Context.Response.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`HttpApplication`对象的每个实例可能会提供多个(但始终是顺序的)请求,因此您必须*在BeginRequest事件期间重置该标志.这也适用于``IsReusable`属性返回true的`HTTPHandler`.请参阅[HttpApplication](http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx)和[IsResuable](http://msdn.microsoft.com/en-us/library/ system.web.ihttphandler.isreusable.aspx)在MSDN中了解详情. (4认同)
  • `HeadersWritten`属性是从.Net 4.5.2开始公开的 (4认同)
  • 您也可以将bool存储到HttpContext.Items中,该HttpContext.Items维护请求的状态.这将确保该值仅适用于特定请求而非全局请求.参见[示例](http://blog.richardadleta.com/2014/02/aspnet-how-to-detect-whether-headers.html). (3认同)