如何正确处置IHttpModule?

如何正确处置IHttpModule?

问题描述:

IHttpModule执行所有我见过的看起来以下:如何正确处置IHttpModule?

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

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

    public void Dispose() 
    { 
    // nothing here !!! 
    } 
} 

我很奇怪,为什么是Dispose方法总是空的?我们不应该取消订阅我们在Init方法中订阅的活动吗?

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

在这种情况下,由于发布者(HttpApplication)正在被处置,因此退订事件没有意义。当然,在出版商没有被处置的情况下,解开事件处理程序是正确的。

+4

我试着在Dispose上取消注册,并得到InvalidOperationException异常消息“事件处理程序只能在IHttpModule初始化过程中绑定到HttpApplication事件。” – angularsen 2012-10-11 08:27:24

如果您需要在模块中实例化IDisposable对象,则dispose方法将不会为空。

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(); 
    } 
}