经过一番工作后,我设法使它工作。
在.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 应用程序或托管处理程序的请求调用”呢?
我现在能够在每个请求上运行模块。之前无法运行的原因是我的失误导致了一个完全无关的错误。
使其正常工作的步骤如下:
当然,并不总是让所有代码在所有请求上运行都是个好主意,因此您可能需要筛选一些请求的文件。
但还有一个问题尚未解决!
现在有两个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 托管模块一样运行?
这一定是可能的,对吧?
您需要在服务器级别添加一个模块。您可以通过命令行执行此操作:
appcmd add module /name:string /type:string /preCondition:string
执行以下命令行获取帮助信息:appcmd add module /?
简单来说,应该长这样:
appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName
/preCondition
参数是可选的。
更多详细信息请点击这里。
或者从IIS管理器中进行操作,进入服务器节点->模块->添加托管模块。
更多详细信息请点击这里。(页面底部)