HttpModule не работает с Visual Studio
Я использую HttpModule для сокращения URL-адресов на моем сайте. Я использую Visual Studio 2008 и IIS 7 и .Net 3.5.
Когда модуль указан в элементе system.webServer web.config, и сайт запускается в IIS, он отлично работает. Конфигурация выглядит так:
<system.webServer>
<modules>
<add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
</modules>...
Мой модуль присоединяется к событию BeginRequest, все работает. Однако я не могу заставить его работать с использованием встроенного веб-сервера VS (Cassini). Я попытался переместить конфигурацию модуля в элемент system.web в web.config, не повезло. Я наложил на него точку останова, ничего не происходит.
Любые мысли о том, почему это будет проблемой?
(Я также пробовал событие Application_BeginRequest в global.asax. Все равно не повезло, хотя я бы предпочел сохранить все в web.config в любом случае.)
Ответы
Ответ 1
Cassini, веб-сервер разработки, поставляемый с IIS, использует синтаксис модуля IIS6, поэтому вы должны дублировать модуль так, чтобы он
<system.web>
<httpModules>
<add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="MinimizeModule" />
<add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule"
preCondition="managedHandler" />
</modules>
</system.webServer>
Обратите внимание, что я также добавил предварительное условие для настроек IIS7
Ответ 2
Если вы работаете в IIS 7, поместите модуль в:
<configuration>
<system.webServer>
<modules>
<add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
</modules>
</system.webServer>
</configuration>
Если вы работаете на Cassini (интегрированный миниатюрный веб-сервер Visual Studio), поместите модуль в:
<configuration>
<system.web>
<httpModules>
<add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
</system.web>
</configuration>
IIS выйдет из строя, если вы дадите ему местоположение Кассини.
Cassini выйдет из строя, если вы укажете местоположение IIS.
Всякий раз, когда я развертываю, я должен быть уверен, что не развертывать web.config
. Я также включаю заметки в web.config
:
<system.web>
<!--The Cassini location to add modules (comment out for IIS)-->
<httpModules>
<!--WARNING: IIS will crash if you leave this in here.
IISBUG: IIS doesn't support system.web/httpModules,
and Cassini doesn't support system.webServer/modules
-->
<!--Comment out for IIS-->
<add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/>
</httpModules>
</system.web>
<system.webServer>
<!--The IIS7 location to add modules (comment out for Cassini)
<modules runAllManagedModulesForAllRequests="true">
<!--IIS7 will crash if you present a system.web httpModules. -->
<remove name="PerformanceHttpModule" />
<add name="PerformanceHttpModule" type="DummyPlaceholder.PerformanceHttpModule"/>
</modules>
</system.webServer>
Левая рука IIS не знает, что делает правая рука Кассини, и они оба прикрутили ее.
Ответ 3
Вы попытались также поместить объявление модуля в элемент? При работе в dev с использованием Cassini, обычно это место, где я должен поместить модули, чтобы они запускались.