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开始公开的
塞缪尔的回答刚刚为我解决了这个问题(+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)
| 归档时间: |
|
| 查看次数: |
7698 次 |
| 最近记录: |