Обнаружение того, что заголовки asp.net http уже отправлены

Я добавляю заголовки на страницу следующим образом: Page.Response.AddHeader( "foo", "bar" );

В зависимости от предыдущей обработки иногда это терпит неудачу: "Сервер не может добавлять заголовок после отправки HTTP-заголовков". Я имею в виду это, прилагая Page.Response.AddHeader( "foo", "bar" ); в конструкции try-catch. Однако, чтобы держать вещи более чистыми и избегать генерации исключения, есть ли способ обнаружить, что заголовки уже отправлены? (Кстати, если я попытаюсь оценить страницу .Response.Headers, тогда я получаю следующую ошибку: "Эта операция требует интегрированного режима конвейера IIS" )

Спасибо

Ответ 1

К сожалению, пока объект HttpResponse имеет свойство HeadersWritten и поле поддержки, называемое _headersWritten, ни одно из них не доступно извне сборки System.Web - если вы не используете Reflection. Я не понимаю, что вы думаете, что сможете получить из коллекции Headers, она может существовать или не существовать независимо от того, были ли отправлены заголовки.

Если вы хотите использовать Reflection, у него могут быть собственные штрафы за производительность, и это потребует от вашего приложения полного доверия.

Все общедоступные методы HttpResponse, которые включают в себя поле _headersWritten, похоже, используют его для генерирования исключения.

Ответ 2

Вы можете использовать HttpModule для регистрации для события PreSendRequestHeaders. Когда он вызывается, напишите значение HttpContext.Current.Items, указывающее, что отправляются заголовки, а затем всюду в вашем коде вы проверяете значение в HttpContext.Current.Items, чтобы узнать, было ли еще отправлено.

Ответ 3

Начиная с .NET 4.5.2, вы можете сделать это с помощью общедоступного свойства HeadersWritten HttpResponse (см. msdn docs):

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

Ответ 4

Попытка установить буфер буфера на значение false:

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

Это облегчит вашу первую проблему, но ваши перфомансы и пользовательский опыт могут пострадать. Также "Эта операция требует интегрированного режима конвейера IIS" связана с обработкой сервера, не относящимся к IIS 7, этой строкой кода. Вы можете найти дополнительную информацию об этом здесь:

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

Ответ 5

Я использовал HttpContext.Current.Response.Headers.Count, когда отправлено общее количество заголовков; вы можете просто применить выражение If, если это необходимо.