2011-06-18 1 views
1

Я построил модуль http в C#, который просто переопределяет EndRequest жизненного цикла, проверяет код состояния заголовка ответа и изменяет код ответа, если это необходимо. Что-то вроде:Модификация ответа в модуле HTTP

HttpContext context = ((HttpApplication)source).Context; 
if (context.Response.StatusCode == 200) 
{ 
    context.Response.StatusCode = 404; 
} 

Это, кажется, работает хорошо для меня, когда я проверить его на локальном хосте (реальный IIS), но когда я включаю доступ к внутренней сети и тест с другого компьютера он не каждый раз.

ошибки я вижу, когда я проверяю с помощью другого компьютера:

«Статус сервера не может установить после того, как HTTP заголовков будет отправлена»

Я также заметил, что запрашивает один и тот же файл дважды, тогда как локально он запрашивает только один файл. Я слышал, что кто-то сказал что-то о выходной буферизации, но я также попытался установить на ответ BeginRequest OutputBuffer значение true и получил те же результаты.

Мысли?

ответ

4

Вам необходимо изменить ответ до отправки заголовков. Мне никогда не приходилось это делать, но я бы предположил, что правильным событием будет PreSendRequestHeaders. link

Here's an example установки заголовков в этом случае.

Если это событие не работает для вас, ознакомьтесь с некоторыми событиями после процесса обработки обработчика в конвейере: http://blogs.msdn.com/b/carloc/archive/2007/12/19/application-page-and-control-lifecycle.aspx Будьте осторожны, потому что вам, возможно, придется переписать код для интегрированного конвейера IIS 7.

+1

Просто подумал, что я вернусь и закрою это. Здесь было две проблемы, первая из которых решила ваше предложение. Вторая проблема связана с конвейером, но не с asp.net. IIS имеет «функцию» для возврата определенных страниц ошибок при отправке определенных кодов состояния. Это происходит ПОСЛЕ обработки, выполняемой в .NET, но вы можете отключить ее. Если вы включите «подробные ошибки» и удалите обработчик для кода состояния, вы получите исходное содержимое страницы, которое не будет изменено. По умолчанию это только локально. – pinvoke