我创建了一个小型类库,其中一个HttpModule使用过滤器为IIS7提供的每个请求页面添加一些html。
我首先通过在测试网站的web.config中注册模块来测试它,它可以正常工作,但只能在那个应用程序中运行。
我生成了一个dll,并创建了一个强大的命名程序集。
我需要以某种方式将此程序集作为模块添加到服务器级别的IIS中,以便它适用于所有请求,所有应用程序以及nonasp.net内容。
到目前为止,我已尝试将.dll添加为本机模块。这不起作用。它位于本机模块列表中,但不起作用。
我在GAC中安装了.dll。
继续阅读,似乎我必须将程序集添加为托管模块,然后在IIS中“添加托管模块”下的下拉列表中选择它。
为此,我尝试使用命令行工具appcmd,写道:“add module / name:string / type:string / preCondition:string”
我没有成功这样做,因为我无法弄清楚要设置什么类型和前置条件。
正如我所读到的,在IIS中注册的模块应该适用于所有站点中的所有应用程序以及所有请求。
重点是避免在每个应用程序web.config文件中注册模块。
有什么想法吗?
答案 0 :(得分:6)
使用了一段时间之后,我设法让它发挥作用。
在.net 4.0 GAC中安装程序集不会使其在IIS管理器的“添加托管模块”下的类型下拉列表中可用。
我必须做的是:
创建.net 4.0类库,并将其编译为强名称程序集
使用位于Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ bin \ NETFX 4.0 Tools
中的gacutil将其安装在.net 4.0 GAC中(或者让Visual Studio自动编译,签名并安装程序集)
在applicationHost.config中的<modules>
下添加此行:(必须手动完成,不能在管理器中完成)
<add name="MyName" type="NameSpace.ClassName" preCondition="managedHandler,runtimeVersionv4.0" />
这使得模块可以运行在.net 4中开发的站点的请求。
但是,对于在.net 4版本中开发的网站的请求似乎无法使用在.net 4.0中创建的模块。因此,如果您在.net 3.5中创建的站点中请求页面,则该模块将无法工作。
另一个观察结果:
通过applicationHost.config文件将模块添加到IIS后,如果打开IIS管理器,请突出显示连接中的服务器名称并单击模块。您将在列表中看到.net 4模块。
双击它,然后您将看到它的设置。您将看到“复选仅针对ASP.NET应用程序或托管处理程序的请求”复选框已选中。如果取消选中它,然后点击“确定”,则会收到错误消息,指出该程序集尚未安装在GAC中。
但是我不是只是在.net 4 GAC中成功安装它吗?我不是只看到模块在请求中运行吗?
如果继续保存设置,则会出现运行时错误,如果查看applicationHost.config,您会看到之前手动添加的模块设置已更改。
但是,如果我想“仅针对ASP.NET应用程序或托管处理程序的请求调用?
,该怎么办?”答案 1 :(得分:5)
我现在能够在每个请求上运行该模块。之前没有工作的原因是我的一个完全不相关的错误。 因此,使其工作的步骤是:
当然,让所有代码都在所有请求上运行并不总是一个好主意,因此您可能需要过滤一些请求的文件。
但仍存在一个问题!
现在有两个GAC,Microsoft.NET用于.net 4.0,而Windows GAC用于.net 4.0。 因为我在.net 3.5中创建了程序集,所以它安装在Windows GAC中,因此它在IIS管理器的类型下拉列表中可用。
当我在.net 4.0中创建程序集时,它已安装在Microsoft.NET GAC中,因此,它在IIS管理器的类型下拉列表中不可用。
问题是:如何在IIS7中将.net 4.0程序集添加为托管模块,并让它像我的3.5托管模块一样运行?
这一定是可能的,对吧?
答案 2 :(得分:2)
您必须在服务器级别添加模块。您可以从命令行执行此操作:
appcmd add module /name:string /type:string /preCondition:string
要获取命令行帮助,请执行:appcmd add module /?
简而言之,它必须看起来像:
appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName
/preContition
参数是可选的。
更多详情here。
OR
通过转到服务器节点从IIS管理器执行此操作 - &gt;模块 - &gt;添加管理模块
更多细节here。 (页面底部)