在IIS 7中注册的模块不起作用

时间:2012-02-09 12:07:53

标签: iis-7 httpmodule

我创建了一个小型类库,其中一个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文件中注册模块。

有什么想法吗?

3 个答案:

答案 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)

我现在能够在每个请求上运行该模块。之前没有工作的原因是我的一个完全不相关的错误。 因此,使其工作的步骤是:

  1. 将您想要在每个请求上运行的代码编写为.net 3.5类库。
  2. 将其编译为强名称的程序集。
  3. 在GAC中安装程序集。
  4. 在IIS7管理器中,选择连接中的服务器名称,单击“模块”,单击“添加管理模块”。
  5. 为模块写一个名称,然后在类型下拉列表中选择新安装的程序集。
  6. 确保该站点使用以集成模式运行的应用程序池。
  7. 当然,让所有代码都在所有请求上运行并不总是一个好主意,因此您可能需要过滤一些请求的文件。

    但仍存在一个问题!

    现在有两个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。 (页面底部)