在IIS7中注册的模块无法工作

8
我创建了一个小型的类库,其中包含一个HttpModule,使用过滤器向IIS7提供的每个请求页面添加一些HTML。我首先通过在测试网站的web.config中注册模块进行了测试,它能够正常工作,但仅适用于该应用程序。我生成了一个dll,并创建了一个强名称的程序集。我需要以某种方式将此程序集作为模块添加到IIS的服务器级别上,以便它可以适用于所有请求、所有应用程序和非ASP.NET内容。到目前为止,我已经尝试将.dll添加为本机模块。这并不起作用。它在本机模块列表中,但它不起作用。我已经将.dll安装在GAC中。继续阅读后,似乎我必须将程序集添加为托管模块,然后在IIS下拉列表中选择它。为此,我尝试使用命令行工具appcmd编写:"add module /name: string /type: string /preCondition: string",但我无法确定要设置为类型和预条件。据我所知,在IIS中注册的模块应该适用于所有站点的所有应用程序和所有请求。关键是避免在每个应用程序的web.config文件中注册模块。有什么想法吗?

http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/ - Lex Li
我已经编辑了我的答案,并提供了更多有关如何使用appcmd命令的帮助。如果你不熟悉命令行使用,不要将它添加为本机模块,请使用IIS Manager添加“托管模块”,在我的答案中有详细的步骤说明。 - Tomek
3个回答

6

经过一番工作后,我设法使它工作。

在.NET 4.0的GAC中安装程序集不会在IIS管理器的“添加托管模块”下拉菜单中使其可用。

我所做的是:

创建.NET 4.0类库,并将其编译为强名称程序集

使用gacutil(位于Program Files(x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools中)将其安装在.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 应用程序或托管处理程序的请求调用”呢?


谢谢,Soeren,阅读您的问题和您自己在这里提供的答案对我很有帮助。我有一个关于下一步的问题。如果模块正在运行而没有特定的应用程序,您将如何为其放置配置文件?我的意思是,为这样的服务器级模块放置某种配置文件的标准方式是什么? - Bakhshi
你好,你的东西对我很有用,但是你所说的applicationHost.config文件在哪里呢?我也遇到了类似的问题... - SutharMonil

5

我现在能够在每个请求上运行模块。之前无法运行的原因是我的失误导致了一个完全无关的错误。

使其正常工作的步骤如下:

  1. 将您想要在每个请求上运行的代码编写为 .net 3.5 类库。
  2. 将其编译为强命名程序集。
  3. 在 GAC 中安装该程序集。
  4. 在 IIS7 管理器中,选择连接中的服务器名称,单击“模块”,单击“添加托管模块”。
  5. 为模块编写名称,并在类型下拉菜单中选择新安装的程序集。
  6. 确保站点使用在集成模式下运行的应用程序池。

当然,并不总是让所有代码在所有请求上运行都是个好主意,因此您可能需要筛选一些请求的文件。

但还有一个问题尚未解决!

现在有两个GAC,一个是 .net 4.0 的 Microsoft.NET,另一个是早期版本的 Windows GAC。

因为我在 .net 3.5 中创建了我的程序集,所以它被安装在 Windows GAC 中,因此在 IIS 管理器中的类型下拉列表中可用。

当我在 .net 4.0 中创建我的程序集时,它安装在 Microsoft.NET GAC 中,结果在 IIS 管理器的类型下拉列表中不可用。

问题是:如何在 IIS7 中添加 .net 4.0 程序集作为托管模块,并像我的 .net 3.5 托管模块一样运行?

这一定是可能的,对吧?


IIS 7附带的IIS Manager版本是基于.NET 3.5构建的。因此,它将无法从.NET 4 GAC加载任何内容。 - Lex Li

3

您需要在服务器级别添加一个模块。您可以通过命令行执行此操作:

appcmd add module /name:string /type:string /preCondition:string

执行以下命令行获取帮助信息:appcmd add module /?
简单来说,应该长这样:

appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName

/preCondition参数是可选的。

更多详细信息请点击这里

或者从IIS管理器中进行操作,进入服务器节点->模块->添加托管模块。
更多详细信息请点击这里。(页面底部)


谢谢。正如您所注意到的,我已经多次编辑了我的问题,因为我想尽可能地具体。我会尝试您的建议并回来。 - Soeren
汇编现在作为托管模块添加到程序中,但是出现了错误提示:"System.Web.HttpException: 无法加载类型..." 这表明找不到 dll 文件。这个 dll 文件需要放在特定的位置吗?我已经将其复制到 "inetsrv" 文件夹中。该汇编还安装在全局程序集缓存 (GAC) 中。 - Soeren
你可以尝试通过IIS管理器添加它吗? - Tomek
好的,现在我尝试在.NET 3.5中创建类库,并从中编译一个强名称程序集。该程序集安装在Windows GAC中,并可作为托管模块添加到IIS7中,使用IIS管理器。然而,该模块仍无法在请求上运行。HTML未添加到请求的页面中。 - Soeren
是的,如果我在web.config中添加模块并在IIS Express中进行测试,它可以工作。 - Soeren
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接