我正在开发一个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模块的推荐方法是什么?应如何处理配置,以便所有配置都位于中心位置?
答案 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">