HttpModule在Visual Studio中无法运行

21

我正在使用一个HttpModule在我的网站上进行URL缩短。我使用的是Visual Studio 2008和IIS 7,以及.Net 3.5。

当该模块在web.config文件的system.webServer元素中指定,并且网站在IIS中运行时,它能够正常工作。配置看起来像这样:

<system.webServer>
        <modules>
            <add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
        </modules>...

我的模块附加到BeginRequest事件上,一切都正常。但是,我无法在内置的VS Web服务器(Cassini)上运行它。我尝试将模块配置移动到web.config的 system.web 元素中,但没有成功。我设置了一个断点,但什么也没发生。

有任何想法为什么会出现这个问题吗?

(我还尝试了global.asax中的Application_BeginRequest事件。可惜还是没有成功,不过我更喜欢把所有东西都放在web.config中。)

3个回答

41

使用 IIS 提供的开发 Web 服务器 Cassini,要使用 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设置添加了一个前置条件。

我尝试过这个。我的模块 .ctors 和 Init(),但任何尝试附加事件处理程序都会遇到 PlatformNotSupportedException - Cassini 似乎完全忽略了 IIS7 部分。 - Hafthor
1
是的,Cassini确实需要 - 您还必须添加IIS6语法,因此两者都在那里。 - blowdart
谢谢你,我之前遇到了相反的问题,让我有点疯狂。我认为这是IIS的一个bug:要么它已经注册了(那么我就不需要再次注册),要么它没有注册(那么我就不需要在注册之前将其删除!)。但这是另一个问题。最重要的是现在它可以工作了。谢谢。 - Adam

2

如果你正在运行IIS 7,将模块放在以下位置:

<configuration>
   <system.webServer>
      <modules>
         <add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
      </modules>
   </system.webServer>
</configuration>

如果您正在使用Cassini(Visual Studio集成的迷你Web服务器),请将模块放在以下位置:
<configuration>
   <system.web>
      <httpModules>
          <add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
   </system.web>
</configuration>

如果你将Cassini的位置提供给IIS,IIS会崩溃。
如果你将IIS的位置提供给Cassini,Cassini会崩溃。

每次部署时,我必须确保不要部署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的左手不知道Cassini的右手在干什么,它们都把它搞砸了。


注:该句话意思是IIS和 Cassini之间缺乏协调合作,导致系统出现问题。

0

你尝试把模块声明放在 <system.webServer> 元素中了吗?当使用 Cassini 进行开发时,那通常是我必须放置模块以使它们运行的地方。


您可以进一步解释一下吗?我不太明白您的意思。 - Matthew Groves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接