2010-08-06 65 views
24

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方法中訂閱的活動嗎?

回答

23

HttpModule的生命週期與HttpApplication的生命週期緊密集成。 HttpModule的實例在應用程序啓動時生成,並在應用程序被處理時銷燬。

在這種情況下,由於發佈者(HttpApplication)正在被處置,因此退訂事件沒有意義。當然,在出版商沒有被處置的情況下,解開事件處理程序是正確的。

+4

我試着在Dispose上取消註冊,並得到InvalidOperationException異常消息「事件處理程序只能在IHttpModule初始化過程中綁定到HttpApplication事件。」 – angularsen 2012-10-11 08:27:24

3

如果您需要在模塊中實例化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(); 
    } 
}