如何正确处理IHttpModule?

Jak*_*urc 25 c# asp.net httpmodule

我见过的所有IHttpModule实现如下:

class HttpCompressionModule : IHttpModule
{
  public void Init(HttpApplication application)
  {
    application.SomeEvent += OnSomeEvent;
  }

  private void OnSomeEvent(Object source, EventArgs e)
  {
    // ...
  }

  public void Dispose() 
  {
    // nothing here !!!
  } 
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Dispose方法总是空的?我们不应该取消订阅我们在Init方法中订阅的事件吗?

Mat*_*t B 24

HttpModule的生命周期与HttpApplication的生命周期紧密集成.应用程序启动时会生成HttpModule实例,并在处理应用程序时将其销毁.

在这种情况下,取消订阅事件是没有意义的,因为无论如何都要处理发布者(HttpApplication).当然,在发布者没有被处理的情况下,取消事件处理程序是正确的.

  • 我尝试在Dispose上取消注册并获得InvalidOperationException,并显示消息"事件处理程序只能在IHttpModule初始化期间绑定到HttpApplication事件". (5认同)

Tho*_*ton 5

The dispose method won't be empty if you need to instantiate IDisposable objects inside your module.

class HttpCompressionModule : IHttpModule
{
  private IDisposalbe _myResource;

  public void Init(HttpApplication application)
  {
    _myResource = new MyDisposableResource();
    application.SomeEvent += OnSomeEvent;
  }

  private void OnSomeEvent(Object source, EventArgs e)
  {
    // ...
    myResource.DoSomething();
  }

  public void Dispose() 
  {
    _myResource.Dispose();
  } 
}
Run Code Online (Sandbox Code Playgroud)