如何正确处置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)正在被处置,因此退订事件没有意义。当然,在出版商没有被处置的情况下,解开事件处理程序是正确的。
答
如果您需要在模块中实例化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();
}
}
我试着在Dispose上取消注册,并得到InvalidOperationException异常消息“事件处理程序只能在IHttpModule初始化过程中绑定到HttpApplication事件。” – angularsen 2012-10-11 08:27:24