【发布时间】:2023-03-16 13:50:01
【问题描述】:
我正在开发一个托管的 HTTP 模块,它将拦截来自 IIS 7 的请求和响应。拦截的消息将通过自定义过滤器根据一组业务规则进行修改。业务规则将存储在配置文件中。
消息必须在整个网站范围内被截获。这包括作为网站子级存在的任何应用程序或虚拟目录。我的第一次尝试是在所需网站的 bin 目录中安装 HTTP 模块程序集。(例如,默认网站为 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 应用程序下的任何资源时会收到以下错误:
无法加载文件或程序集 '公司.产品.模块, 版本=1.0.0.0,文化=中性, PublicKeyToken=xxxxxxxxxxxxxxxxxx' 或 它的依赖项之一。系统 找不到指定的文件。
我知道有两种方法可以解决这个问题:
选项 1:
将 HTTP 模块程序集和所有依赖程序集复制到每个应用程序的 bin 目录。我相信我还需要从父目录复制配置信息。随着越来越多的应用程序被添加到网站,这可能成为管理方面的噩梦。
选项 2:
在 GAC 中安装 HTTP 模块程序集和所有依赖程序集。这似乎工作得很好,并且避免了很多管理开销,但是,配置信息在哪里?如果在网站的 web.config 文件中,这些信息是否会在所有子应用程序中继承?
在站点范围内部署托管 HTTP 模块的推荐方法是什么?应该如何处理配置,以便所有配置都在一个中心位置?
【问题讨论】:
标签: .net iis-7 httpmodule .net-3.5 .net-4.0