IIS7安装/配置本机模块

时间:2018-08-02 16:34:47

标签: c# iis iis-modules

我正在学习开发有关为Web应用程序使用的IIS创建模块的信息。当我将.dll添加到IIS托管的Web应用程序的/ bin文件夹中时,它可以工作。

但是,如果我将此.dll添加到根本地服务器> 模块> 配置本机模块注册 >。它没有用,当我运行Web应用程序时,正在使用的AppPool停止了,我从eventviewer中看到的日志是:

  

无法在模块DLL中找到RegisterModule入口点   %windir%\ TestWebAgent \ x86 \ TestModule.dll。   数据就是错误。

这是我扩展IHttpModule的类:

using System;
using System.Web;

namespace MyTestModule
{
    public class TestModule : IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication application)
        {
            application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
        }

        private void Application_BeginRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            context.Response.Write("<h1><font color=green>AUTHENTICATED</font></h1><hr>");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

对于遇到相同问题/问题的任何人。 Lex Li的评论是正确的。

我编写的类库是一个托管模块。在我去过的几乎所有指南/教程中都不清楚。因此,这就是我要做的工作:

  1. 将.dll注册到全局程序集缓存(GAC)

    • 要将.dll注册到GAC,必须对其进行签名。转到项目的属性:Visual Studio>解决方案资源管理器>右键单击项目,然后选择“属性”。
    • 转到“签名”选项卡,选中“为程序集签名”。
    • 选择一个强名称密钥文件,然后选择“新建”
    • 输入密钥文件名
    • 取消选中用密码保护我的密钥文件,然后单击“确定”
    • 清理项目并重建
  2. 使用gacutility将程序集注册到GAC(如果未安装gacutility.exe,则可以下载Windows SDK)

    • 要将程序集注册到GAC,可以使用VS Developer命令提示符(以管理员权限运行)(如果没有VS Developer命令提示符,则可以使用具有管理员权限的cmd并将目录更改为gacutility.exe的位置)
    • 确认您的dll未注册
    • gacutil / l MyModule.Test(假设您的dll名为MyModule.Test.dll)
    • 要安装:gacutil / i C:/path_to_dll/MyModule.Test.dll
    • 获取公共密钥令牌:gacutil / l MyModule.Test(注意公共密钥令牌,我们将其用于web.config)。
  3. 在Web应用程序的web.config中添加模块:

    <system.webServer>
        <modules>
          <add name="MyModule" type="Namespace.ClassName, ProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=999cf99ff999a99e, processorArchitecture=MSIL" preCondition="managedHandler,runtimeVersionv4.0" />
        </modules>
    </system.webServer>
    

答案 1 :(得分:0)

对于 NATIVE MODULES 遇到此错误并最有可能在x64版中编译的任何人

  

无法在模块DLL中找到RegisterModule入口点

尽管在VC ++项目中仅具有* .def文件似乎适用于Win32 x86编译的DLL。在将配置管理器切换到Release x64编译的DLL模块(并在IIS中删除Web配置 bitness32 )时,您可能会遇到此错误。 您必须在项目属性下的链接器的命令行选项中包括“ / EXPORT:RegisterModule”。

使用我的本机模块x64 DLL,我沿着这条路径走了好几个小时,试图弄清楚如何构建我的强命名VC ++ DLL。只是让SN.EXE不断告诉我我的DLL

  

不代表全名程序集

我得出的结论是VC ++编译的x64 DLL不能强力命名,这不是解决我的问题的方法。 有时错误消息实际上是问题所在,RegisterModule未被导出。