Как я могу узнать, когда HTTP-заголовки были отправлены в приложении ASP.NET? - PullRequest
14 голосов
/ 04 марта 2010

Короче говоря, у меня есть приложение ASP.NET, которое я пытаюсь отладить, и в какой-то момент, в определенных обстоятельствах, приложение будет выдавать исключения с Response.Redirect() заявлением:

"Cannot redirect after HTTP headers have been sent."

Что я более или менее получаю, за исключением того, что я не могу понять , где заголовки были отправлены.

Есть ли что-то, что нужно искать в приложении ASP.NET, которое будет указывать, что заголовки HTTP были отправлены?

БОНУСНЫЕ СЛОЖНОСТИ: Приложение ASP.NET все еще находится в .NET 1.1. Обстоятельства, связанные с задержкой обновления, являются очень болезненным вопросом.

Ответы [ 2 ]

16 голосов
/ 04 марта 2010

HttpApplication имеет событие PreSendRequestHeaders, которое вызывается только тогда, когда заголовки записываются. Подпишитесь на это и войдите в систему или добавьте точку останова.

Помимо этого, HttpResponse имеет внутреннее свойство , которое называется HeadersWritten (_headersWritten поле в .NET 1.1). Поскольку он внутренний, вы не можете получить к нему доступ напрямую, но вы можете через рефлексию. Если это только для внутренней отладки (т. Е. Не для производственного кода), тогда можно использовать рефлексию.

Проверьте этот метод до / после всех событий lifecylce страницы. Как только вы узнаете, какое событие записывает заголовки, добавьте больше проверок HeadersWritten, чтобы узнать, где они пишутся. Благодаря постепенному сужению проверок этого свойства вы найдете его.

Новая информация

HeadersWritten свойство является публичным, начиная с .Net 4.5.2

5 голосов
/ 12 мая 2011

Ответ Самуила только что решил эту проблему для меня (+1). Я не могу вставить пример кода в комментарий, но в интересах помощи другим, вот как я использовал событие, которое он предложил добавить свойство HeadersWritten в мой IHTTPHandler:

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();
}

В моем коде, который сломался бы, если бы я связался с заголовками слишком поздно, я просто сначала проверяю свойство HeadersWritten:

if (!HeadersWritten)
{
    Context.Response.StatusDescription = get_custom_description(Context.Response.StatusCode);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...