HttpModule запускается только для статических страниц - PullRequest
0 голосов
/ 27 января 2011

У меня есть HttpModule для обработки ошибок и их запуска в среде разработки Visual Studio.Это работает хорошо.Для клиента существуют жесткие 404 с и без явных перенаправлений.Google Analytics должен быть очень доволен этим.

Отладка в Visual Studio 2008 при переходе на localhost:

[port]/this_page_doesnt_exist.html, I get a our 404 error page and the hard 404.  

Он также работает на сервере разработки для

localhost:[port]/this_page_doesnt_exist.aspx.

Когда я портирую все это на наш IIS7 веб-сервер, у меня все работает точно так же, как и для статических файлов HTML.Однако я определил, что мой модуль вообще не вызывается для файлов aspx.Если я поверну customErrors Off, я получу стандартную уродливую страницу 404.(Если customErrors равно RemoteOnly, они действительно включаются.)

Кажется, что подсказки указывают на некоторую настройку IIS, которую я не настроил должным образом, но я не могу дляжизнь меня найти.Есть идеи?

Дополнительная информация:

Я работаю в интегрированном режиме, и мой web.config содержит следующие разделы:

<configuration>
    <system.web>
      <httpModules>
        <add name="ErrorModule" type="HttpModules.ErrorModule, HttpModules"/>
      </httpModules>
    </system.web>
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      <modules>
        <add name="ErrorModule"  preCondition="managedHandler" type="HttpModules.ErrorModule, HttpModules"/>
      </modules>
    </system.webServer>
</configuration>

Еще больше информации

То, что я думал, происходило в IIS7, но не то, что происходило.Единственная причина, по которой я увидел сообщение об ошибке 404 для файлов HTML на сервере, заключалась в том, что его получал нативный модуль CustomErrorHandler.Когда я выключил этот модуль, теперь мой ErrorHandler работает для файлов aspx, но не для файлов HTML.

Я должен быть близко, но я изо всех сил пытался получить мои настройки до конца.Кто-нибудь может подтолкнуть меня за линию ворот?

Ответы [ 2 ]

1 голос
/ 27 января 2011

Держу пари, что вы не правильно зарегистрировали модуль в web.config для IIS 7 при использовании интегрированного конвейера. Для правильной работы модуля HTTP с IIS 7 необходимо также зарегистрировать модуль в разделе <system.webServer> следующим образом:

<configuration>
    <system.web>
        <httpModules>
            <add name="..." type="..." />
        </httpModules>
    </system.web>

    <system.webServer>
            <validation validateIntegratedModeConfiguration="false" />

            <modules>
                <add name="..." type="..." preCondition="managedHandler" />
            </modules>
    </system.webServer>
</configuration>

Я так понимаю, у вас есть раздел <httpModules>, но нет раздела <system.webServer>?

Кроме того, какой модуль регистрации ошибок вы используете? Если вы используете свою домашнюю выпечку, могу ли я предложить ELMAH ? С ним легко начать работу, он имеет открытый исходный код и широко используется, поэтому вы можете быть уверены, что ошибки и изгибы устранены из него.

Счастливого программирования!

0 голосов
/ 28 января 2011

После долгой борьбы мой вывод таков: «Взаимодействие существующих модулей на вашем конкретном веб-сервере и то, как обработка ошибок поддерживается вашими настройками web.config и IIS, может привести к необычным специфическим для разработчика осложнениям. К счастью, если вы хотите добавить HttpModule для обработки ошибок, Причуды проблемы решаются с помощью инструментов с открытым исходным кодом, таких как ELMAH ". (Я не могу поручиться за ELMAH, но я посмотрел в коде, и, кажется, нужно сделать намного больше, чем то, что я делал, чтобы заставить его работать.)

Но если вы зашли так далеко, вы должны знать, что я должен делать:

В IIS Manager я изменил модуль order так, чтобы мой обработчик ошибок предшествовал собственному CustomErrorModule. (Или повторно укажите все свои модули в корневом каталоге web.config сайта в том порядке, в котором вы хотите.) Запускайте модуль только на управляемом коде.

По какой-то причине мой модуль не замечает запросов на отсутствие статических страниц, даже если он работает для статических страниц. Считайте, что моя нерешенная проблема (которая, по-видимому, ELMAH действительно решает).

В диспетчере IIS я устанавливаю страницы ошибок, чтобы они указывали на пользовательские страницы ошибок. Это для статических страниц. Это были файлы aspx, которые устанавливают Response.StatusCode. Вуаля! Коды жестких ошибок для всего.

...