Iis 7 在IIS7 doens和x27中注册的模块;行不通

Iis 7 在IIS7 doens和x27中注册的模块;行不通,iis-7,httpmodule,Iis 7,Httpmodule,我创建了一个小型类库,其中包含一个HttpModule,它使用一个过滤器向IIS7提供的每个请求页面添加一些html 我首先通过在测试网站的web.config中注册模块来测试它,它可以正常工作,但只在一个应用程序中工作 我生成了一个dll,并创建了一个强命名程序集 我需要以某种方式将此程序集作为服务器级IIS中的模块添加,以便它可以用于所有请求、所有应用程序以及非asp.net内容 到目前为止,我已经尝试将.dll添加为本机模块。这不管用。它在本机模块列表中,但不起作用 我已经在GAC中安装了

我创建了一个小型类库,其中包含一个HttpModule,它使用一个过滤器向IIS7提供的每个请求页面添加一些html

我首先通过在测试网站的web.config中注册模块来测试它,它可以正常工作,但只在一个应用程序中工作

我生成了一个dll,并创建了一个强命名程序集

我需要以某种方式将此程序集作为服务器级IIS中的模块添加,以便它可以用于所有请求、所有应用程序以及非asp.net内容

到目前为止,我已经尝试将.dll添加为本机模块。这不管用。它在本机模块列表中,但不起作用

我已经在GAC中安装了.dll

继续阅读,似乎我必须将程序集添加为托管模块,然后在IIS中“添加托管模块”下的下拉列表中选择它

为此,我尝试使用命令行工具appcmd编写:“addmodule/name:string/type:string/predition:string”

我没有成功地做到这一点,因为我不知道设置什么作为类型和前提条件

正如我所读到的,在IIS中注册的模块应该适用于所有站点中的所有应用程序和所有请求

关键是避免在每个applications web.config文件中注册模块


有什么想法吗?

您必须在服务器级别添加一个模块。您可以从命令行执行此操作:

appcmd add module /name:string /type:string /preCondition:string
要获取命令行帮助,请执行:
appcmd add module/?

简而言之,它必须看起来像:

appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName
/pretition
参数是可选的

更多细节

通过进入服务器节点->模块->添加托管模块,从IIS管理器执行此操作

更多细节。(页面底部)

我现在可以根据每个请求运行模块。它以前不起作用的原因是我完全不相关的错误。 因此,使其工作所涉及的步骤是:

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

    不过还有一个问题

    现在有两个GAC,用于.NET 4.0的Microsoft.NET和用于.NET 4.0之前版本的Windows GAC。 因为我是在.net 3.5中创建程序集的,所以它安装在Windows GAC中,因此它在IIS管理器的类型下拉列表中可用

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

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


    这一定是可能的,对吧?

    在使用这个工具一段时间后,我设法让它工作起来

    在.net 4.0 GAC中安装程序集不会使其在IIS管理器的“添加托管模块”下的“类型”下拉列表中可用

    我要做的是:

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

    使用位于程序文件(x86)\Microsoft SDK\Windows\v7.0A\bin\NETFX 4.0工具中的gacutil将其安装到.net 4.0 GAC中

    (或使Visual Studio自动编译、签名和安装程序集)

    在applicationHost.config的
    下添加此行:(必须手动完成,不能在管理器中完成)

    
    
    这使得该模块可以根据对.NET4中开发的站点的请求运行

    然而,对在.NET4之前版本中开发的站点的请求似乎不能使用在.NET4.0中创建的模块。因此,如果您在.NET3.5中创建的站点中请求页面,该模块将无法工作

    另一个观察结果:

    通过applicationHost.config文件将模块添加到IIS后,如果打开IIS管理器,请在连接中突出显示服务器名,然后单击模块。您将在列表中看到.NET4模块

    双击它,然后您将看到它的设置。您将看到选中了“仅对ASP.NET应用程序或托管处理程序的请求调用”复选框。如果您取消选中它,并点击ok,您将得到一个错误,说明GAC中尚未安装程序集

    但我不是刚刚在.NET4GAC中成功地安装了它吗?我不是看到模块在请求中运行吗

    如果继续并保存设置,则会出现运行时错误,如果查看applicationHost.config,您将看到以前手动添加的模块设置已更改


    但是如果我想呢“仅对ASP.NET应用程序或托管处理程序的请求调用?

    我已编辑了答案,并提供了有关如何使用appcmd命令的更多帮助。不要将其添加为本机模块,如果您在命令行中遇到困难,请使用IIS管理器添加托管模块,请在我的回答中说明步骤。谢谢。正如你所注意到的,我多次编辑我的问题,因为我希望尽可能具体。我将尝试您的建议并返回。程序集现在已作为托管模块添加,现在我收到一个错误:“System.Web.HttpException:无法加载类型…”,这表明找不到dll。dll是否需要位于特定位置?我已将其复制到“inetsrv”文件夹中。该程序集也安装在GAC中。您可以尝试通过IIS管理器添加它吗?如果我使用gacutil将该程序集安装到GAC中,它将位于另一个GAC文件夹(%windir%\Microsoft.NET\assembly\gacmsil),因为它是一个.NET 4.0项目
    <add name="MyName" type="NameSpace.ClassName" preCondition="managedHandler,runtimeVersionv4.0" />