如何在站点范围内部署托管HTTP模块?

时间:2010-11-05 20:25:36

标签: .net iis-7 httpmodule .net-3.5 .net-4.0

我正在开发一个manged HTTP模块,它将拦截对IIS 7的请求和响应。拦截的消息将根据自定义过滤器的一组业务规则进行修改。业务规则将存储在配置文件中。

必须在网站范围内拦截这些消息。这包括作为网站子级存在的任何应用程序或虚拟目录。我第一次尝试将HTTP模块程序集安装在所需网站的bin目录中(例如,默认网站的C:\ inetpub \ wwwroot \ bin)。

安装完成后,我修改了网站web.config文件的<compilation>元素以引用程序集,如下所示:

<compilation debug="false">
    <assemblies>
        <add assembly="Company.Product.Module, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx" />
    </assemblies>
</compilation>

我还修改了网站web.config文件的<modules>元素。

<system.webServer>
    <modules>
        <add name="MyModule" type="Company.Product.Module.MyModule" />
    </modules>
</system.webServer>

这适用于网站下的大多数内容。但是,如果在网站下配置了应用程序(例如/ wwwroot / MyApplication),则在导航到该Web应用程序下的任何资源时会收到以下错误:

  

无法加载文件或程序集   “Company.Product.Module,   版本= 1.0.0.0,文化=中立,   PublicKeyToken = xxxxxxxxxxxxxxxx'或   其中一个依赖项。系统   找不到指定的文件。

我知道有两种解决方法:

选项1:

将HTTP模块程序集和所有相关程序集复制到每个应用程序的bin目录。我相信我还需要从父目录复制配置信息。随着越来越多的应用程序被添加到网站中,这可能成为管理的噩梦。

选项2:

在GAC中安装HTTP模块程序集和所有相关程序集。这似乎工作得很好并且避免了很多管理开销,但是,配置信息在哪里存在?如果在网站的web.config文件中是否在所有子应用程序中继承了此信息?

在站点范围内部署托管HTTP模块的推荐方法是什么?应如何处理配置,以便所有配置都位于中心位置?

3 个答案:

答案 0 :(得分:3)

部署模块

Create a new directory under C:\Inetpub\Wwwroot named Module.
Create a subdirectory named Bin in the newly created Module directory. The resultant path is C:\Inetpub\Wwwroot\Module\Bin.
Copy MyModule.dll from your project's Bin\Debug directory to the C:\Inetpub\Wwwroot\Module\Bin directory.
Follow these steps to mark the new Module directory as a Web application:
    Open Internet Services Manager.
    Right-click the Module directory, and then click Properties.
    On the Directory tab, click Create.
    Click OK to close the Module Properties dialog box.

回到顶部 配置系统

In the C:\Inetpub\Wwwroot\Module directory, create a new file named Web.config.
Paste the following text into Web.config:


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

回到顶部 测试模块

In the C:\Inetpub\Wwwroot\Module directory, create a new .aspx file named Test.aspx.
Paste the following text into Test.aspx:


<%@Page Language="VB"%>
<% Response.Write("Hello from Test.aspx.<br>") %>


In the C:\Inetpub\Wwwroot\Module directory, create a Global.asax file.
Paste the following code in Global.asax:


<%@ Import Namespace="MyModule" %>

<script language="VB" runat=server >
Public Sub MyModule_OnMyEvent(src As Object, e As EventArgs)    
  Context.Response.Write("Hello from MyModule_OnMyEvent called in Global.asax.<br>")
End Sub
</script>


Request the Test.aspx page. You should see the following lines of text:


Hello from OnBeginRequest in custom module.
Hello from MyModule_OnMyEvent called in Global.asax.
Hello from Test.aspx.

答案 1 :(得分:0)

到目前为止,你处于正确的轨道,你能把你的配置放在machine.config中吗?避免维护多个配置?

答案 2 :(得分:0)

你可以GAC这个dll,但如果你已经有了这个dll,它会破坏你的x-copy部署故事。如果您没问题,可以稍后将此模块添加到位置标记中的applicationHost.config中的配置:<location path="MySite">, <location path="MySite/MyApp">