初窺asp.net Runtime (轉載)

動手寫這個系列之前,我猶豫不決,因爲類似的文章在博客圓中,已經不少了,感覺有點不好意思:)園中,有位朋友說過這樣一句話,“我們不要重複發明輪子,而要擴展輪子”,那我就當自己是在“擴展輪子“,給自己找個由頭吧!

在我的博客中,第一篇寫的就是asp.net運行時流程,園子裏的朋友給了很多的寶貴意見,在此謝過了。也有朋友說,太抽象了,不夠細。所以我在工作之餘,抽出時間寫下這點東西!

還是先貼一張圖,所謂一圖勝萬言,使大家對運行時,有一個全局的把握。

圖很明瞭,三個橢圓,不,應該是四個,第一個是asp.net的運行環境,當請求到達www服務inetinfo.exe後,經過aspnet_isapi.dll篩選之後,請求這才真正進入aspnet_wp.exe進程,也就是httpRuntime,之後系統會加載一系列的HttpModule,那麼我們就來看看系統到底加載了哪些模塊。先定位到“C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"CONFIG“,怪了,這個目錄很是熟悉,是的,這是.net系統配置文件machine.config所在的目錄。不過我今天要找的不是他,而是web.config,這是.net專門給web獨立定義connfig文件,沒錯,web.cofig也在此目錄中。

       打開web.config文件後,大家可能很鬱悶,這麼多的數據,怎麼看呢!大家別急,都知道web.config文件是合法的xml文件,那我們就把擴展名config改成xml得了,再用IE打開,數據就一目瞭然了!


很明顯,
Congfiguration根,包括註釋一起,才四個主元素,我們打開system.web節點,

也很明顯,可以看到系統對“輸出緩存”,“會話”,“驗證和授權”等模塊都一一進行配置加載。記得有朋友問,爲什麼在自定義的httpModule中,使用Session[“key”]的時候都會拋出null對象異常呢?我告訴大家,那是因爲Session在此時,還沒有生成,所以在自定義的httpModule中使用Session,那都是瞎忙活!

       有人可能會問,說了這麼多,自定義的HttpModule到底有什麼用呢?先別急,我們先來看看系統的IHttpModule接口的真面目!

[(., =.), 
(., =.)]
public interface IHttpModule
{
// Methods
Dispose();
Init( context);
}

很明顯,從字面意思,就可以看出這兩個方法的作用, Init()用來初始化一個module,傳遞一個HttApplication對象作爲參數,爲以後捕獲處理請求做一些準備,Dispose()用來銷燬不再被module所使用的資源!注意,運行時的大部分方法都是調用HttApplication對象的方法,嚴格說,應該是向HttApplication對象訂閱。

下面我們就動手來寫一個自己的HttpModule

第一步,新建一類庫!

class MyHttpModuleClass:System.Web.IHttpModule//實現IHttpModule接口
{
    
public MyHttpModuleClass()
    
{ }
    
public void Init(HttpApplication application)//實現Init方法
    

        
application.BeginRequest+=new EventHandler(this.application_BeginRequest);
        
application.EndRequest+=new EventHandler(this.application_EndResponse);
    
}
    
private void application_BeginRequest(Object obj, EventArgs e)
    
{

            HttpApplication application = (HttpApplication)obj;

            HttpContext context = application.Context;

            HttpRequest request = context.Request;

            HttpResponse response = context.Response;

            response.Write("hi ,i am from application_BeginRequest"+"</br>");

    }

    private void application_EndResponse(Object obj, EventArgs e)
    
{
        
HttpApplication application = (HttpApplication)obj;

        HttpContext context = application.Context;

        HttpRequest request = context.Request;

        HttpResponse response = context.Response;

        response.Write("hi ,i am from application_EndResponse");

    }

    public void Dispose()//實現Dispose方法,但什麼也不做
    
{ }
}

第二步

新建一website,在她的web.config中,加上httpModules節點!

<httpModules>

<add name="wmjHttpModule" type="MyHttpModule.MyHttpModuleClass"/>

</httpModules>

注意wmjHttpModule爲別名,可以隨便起,MyHttpModule爲程序集名稱,MyHttpModuleClass爲自定義的IHttpModule類名!

第三步

編譯類庫,然後把dll拷貝到GAC,或者website的bin目錄下面,如果是直接放bin目錄下,那麼配置文件就沒必要加上程序集的名稱了

<httpModules>

<add name="wmjHttpModule" type="MyHttpModuleClass"/>

</httpModules>

第四步

F5,您是不是看到這兩句話了呢?

hi ,i am from application_BeginRequest

hi ,i am from application_EndRequest

最後,祝大家好運!

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章