自定义错误处理http模块

时间:2015-11-03 13:24:16

标签: c# iis .net-assembly gac httpmodule

我试图拦截Web服务器上所有站点中发生的错误,以便执行其他有用的操作,例如日志记录。

作为起点,我有

  1. 创建了http模块,它将事件处理程序附加到站点的错误事件。
  2. 使用一组抛出异常的操作方法创建测试MVC项目。
  3. 将创建的http模块类dll添加到GAC。
  4. Http模块类库实现为:

    我创建了一个类库项目,只有一个类扩展了IHttpModule。请注意,这只是一个简化版本。

            using System;
            using System.Reflection;
            using System.Runtime.InteropServices;
            using System.Web;
    
            namespace MyWebModules
            {
                [ComVisibleAttribute(true)]
                public class MyErrorModule : IHttpModule
                {
                    public void Dispose()
                    {
                        throw new NotImplementedException();
                    }
    
                    public void Init(HttpApplication context)
                    {
                        context.Error += new EventHandler(OnError);
                    }
    
                    private void OnError(object sender, EventArgs e)
                    {
                        throw new Exception("Custom exception from MyErrorModule");
                        //TODO removed the above exception and add real life code here. 
                    }
                }
            }
    

    我按照以下流程向GAC添加了dll:

    enter image description here

    1. 使用csc.exe,我从“.cs”代码文件中获取“.netmodule”文件
    2. “。snk”文件来自项目。
    3. al.exe需要“.netmodule”和“.snk”来强制命名.dll
    4. 强名称.dll有资格加入GAC。
    5. 使用MVC测试项目进行测试。

      测试站点web.config具有以下部分。

      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
          <remove name="MyCustomWebModules" />
          <add name="MyCustomWebModules" type="MyWebModules.MyErrorModule,MyWebModules" />
        </modules>
      </system.webServer>
      

      当我访问测试MVC网站时,我希望看到一个错误: “来自MyErrorModule的自定义异常”

      相反,我得到了这个错误:

      “无法加载文件或程序集'MisWebModules'或其依赖项之一。系统无法找到指定的文件。”

1 个答案:

答案 0 :(得分:1)

确定。我在web.config中得到了错误的版本号。我修复了它,它的工作原理。

web.config文件中的综合模块标记应包含以下GAC程序集详细信息。

  • Dll信息
  • 版本号
  • 文化
  • 公钥令牌

以下命令可用于查看详细信息。

gacutil / l