【问题标题】:How to programmatically remove an HttpModule from the ASP.NET pipeline?如何以编程方式从 ASP.NET 管道中删除 HttpModule?
【发布时间】:2011-08-18 13:11:05
【问题描述】:

我们可以使用DynamicModuleUtility.RegisterModule(typeof (SomeHttpModule)) 以编程方式添加 HttpModules - 有没有办法删除它们?

【问题讨论】:

  • 不直接知道以编程方式删除它们的方法。这篇文章可能会对您有所帮助:stackoverflow.com/questions/239802/…。如果应该将其应用于当前请求,那么检查您的自定义 HttpModule 不是更好吗?

标签: asp.net httpmodule


【解决方案1】:
  1. Init方法中实例化HTTP模块Global.asax
  2. 致电Module.Init() 如所述here
  3. 在模块的Init 方法中,挂钩所需的事件处理程序。
  4. 覆盖处理程序中的Dispose 方法并取消挂钩 事件处理程序。
  5. 将实例公开为global.asax 上的公共属性,以便您 注销模块时可以调用Dispose

    // Global.asax
    

公共 IHttpModule MyModuleInstance { 获取;私人套装; }

public override void Init()
{
    base.Init();
    MyModuleInstance = new MyModule();
    MyModuleInstance.Init(this);
}



 // MyModule.cs
    public void Dispose()
    {
        _context.BeginRequest -= context_BeginRequest;
    }

    public void Init(HttpApplication context)
    {
        _context = context;
        context.BeginRequest += context_BeginRequest;
    }
   private void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        app.Context.Response.Write("Hello from OnBeginRequest in custom module.<br>");
    }

// 注销

protected void Button1_Click(object sender, EventArgs e)
    {
        this.ApplicationInstance.MyModuleInstance.Dispose();
    }

【讨论】:

  • 不,Dispose 不起作用。这完全特定于 IHttpModule 的实现。我希望它以与 DynamicModuleUtility.RegisterModule 将其添加到管道中相同的方式从管道中删除。另外,我想删除它的原因是因为它是默认添加的。如果我能够将它添加到我的应用程序实例中,我只会添加它。
  • @Matt - 这很奇怪。为什么要删除别人添加的模块?此外,DynamicModuleUtility 说它是一个基础设施实用程序,不打算直接从您的代码中使用。请在您的问题中更详细地解释该场景,以便帮助人们尝试回答。
  • 因为如果您将 Razor 与 ASP.NET MVC 3 一起使用,则会加载 FormsAuthentication 模块。
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2018-10-28
  • 2012-08-03
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多