ASP.NET Framework深度歷險(2)
2024-07-10 12:58:33
供稿:網(wǎng)友
本文來源于網(wǎng)頁設(shè)計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。asp.net framework深度歷險(2)
author:uestc95
articletype:原創(chuàng)
e-mail:[email protected]
.net framework version:1.0.3705正式版
vs.net(c#) version:7.0.9466正式版
剛剛吃完晚飯,正好在鍵盤上面鍛煉一下手指。
接著上回繼續(xù)寫這個“日記”:
chapter two -- httpmodule是如何工作的?
我們上回說到,一個來自于客戶端的http request被截獲后經(jīng)過層層轉(zhuǎn)交(怎么都在踢皮球?呵呵)到達了httpmodule這個“請求監(jiān)聽器”。
httpmodule就類似于安插在aspnet_wp.exe進程中的一個竊聽器,稍微有些常識的人都會很自然的想象得到竊聽器是用來做什么的,而我們的httpmodule
可以說是作竊聽器的絕好人選了,但是需要明確的是,httpmodule絕對不是簡單的監(jiān)聽器,它可以做到更多的東西,比如它可以對截獲的請求增加一些內(nèi)容
等等。
另外需要明白的是,當(dāng)一個http request到達httpmodule的時候,整個asp.net framework系統(tǒng)還并沒有對這個請求做任何的真正處理,但是我們可以
在這個http request傳遞到真正的請求處理中心(httphandler)之前附加一些我們需要的信息在這個http request至上,或者針對我們截獲的這個http
request信息作一些額外的工作,或者在某些情況下干脆終止?jié)M足一些條件的http request,從而可以起到一個filter過濾器的作用,而不僅僅是一個竊聽器了。
通過查閱msdn(不要去相信.net sdk自帶的那個quickstarts web文檔,正式版本中竟然在很多地方?jīng)]有更新這個文檔,很多東西在正式版本是無效的),
你會發(fā)現(xiàn)系統(tǒng)httpmodule實現(xiàn)了一個叫做ihttpmodule的接口,很自然的就應(yīng)當(dāng)想到,只要我們自己的類能夠?qū)崿F(xiàn)ihttpmodule接口,不就可以完全替代系統(tǒng)的
httpmodule了嗎?完全正確。
在我們開始自己的httpmodule類之前,我先來告訴你系統(tǒng)中的那個httpmodule是什么樣子的,asp.net系統(tǒng)中默認的httpmodule有以下幾個:
system.web.caching.outputcachemodule
system.web.sessionstate.sessionstatemodule
system.web.security.windowsauthenticationmodule
system.web.security.formsauthenticationmodule
system.web.security.passportauthenticationmodule
system.web.security.urlauthorizationmodule
system.web.security.fileauthorizationmodule
好了,我們來開始我們自己的httpmodule構(gòu)建歷程吧。
1)打開vs.net新建一個“class library”項目,將它命名為myhttpmodule。
2)引用system.web.dll文件
在代碼區(qū)域敲入:
using system;
using system.web;
namespace myhttpmoduletest
{
/// <summary>
/// 說明:用來實現(xiàn)自定義httpmodule的類
/// 作者:uestc95
/// 聯(lián)系:[email protected]
/// </summary>
public class myhttpmodule:ihttpmodule
{
/// <summary>
/// 說明:構(gòu)造器方法
/// 作者:uestc95
/// 聯(lián)系:[email protected]
/// </summary>
public myhttpmodule()
{
}
/// <summary>
/// 說明:實現(xiàn)ihttpmodule接口的init方法
/// 作者:uestc95
/// 聯(lián)系:[email protected]
/// </summary>
/// <param name="application">httpapplication類型的參數(shù)</param>
public void init(httpapplication application)
{
application.beginrequest +=new eventhandler(this.application_beginrequest);
application.endrequest +=new eventhandler(this.application_endrequest);
}
/// <summary>
/// 說明:自己定義的用來做點事情的私有方法
/// 作者:uestc95
/// 聯(lián)系:[email protected]
/// </summary>
/// <param name="obj">傳遞進來的對象參數(shù)</param>
/// <param name="e">事件參數(shù)</param>
private void application_beginrequest(object obj,eventargs e)
{
httpapplication application=(httpapplication)obj;
httpcontext context=application.context;
httpresponse response=context.response;
httprequest request=context.request;
response.write("我來自application_beginrequest,:)");
}
/// <summary>
/// 說明:自己定義的用來做點事情的私有方法
/// 作者:uestc95
/// 聯(lián)系:[email protected]
/// </summary>
/// <param name="obj">傳遞進來的對象參數(shù)</param>
/// <param name="e">事件參數(shù)</param>
private void application_endrequest(object obj,eventargs e)
{
httpapplication application=(httpapplication)obj;
httpcontext context=application.context;
httpresponse response=context.response;
httprequest request=context.request;
response.write("我來自application_endrequest,:)");
}
/// <summary>
/// 說明:實現(xiàn)ihttpmodule接口的dispose方法
/// 作者:uestc95
/// 聯(lián)系:[email protected]
/// </summary>
public void dispose(){}
}
}
3)在vs.net中編譯之后,你會得到myhttpmodule.dll這個文件。
4)接下來我們的工作就是如何讓aspnet_wp.exe進程將http request交給我們自己寫的這個httpmodule呢?方法就是配置web.config文件。
在web.config文件中增加如下幾句話:
<httpmodules>
<add name="test" type="myhttpmoduletest.myhttpmodule,myhttpmodule"/>
</httpmodules>
注意要區(qū)分大小寫,因為web.config作為一個xml文件是大小寫敏感的。“type=myhttpmoduletest.myhttpmodule,myhttpmodule”告訴我們
系統(tǒng)將會將http request請求交給位于myhttpmodule.dll文件中的myhttpmoduletest.myhttpmodule類去處理。而這個dll文件系統(tǒng)將會自動
到/bin子目錄或者系統(tǒng)全局程序集緩沖區(qū)(gac)搜尋。我們可以將我們剛才得到的dll文件放在bin子目錄中,至于后者,你可以通過.net sdk正式版
自帶的config工具做到,我們不詳細說了。
好了,我們的用來截獲http request請求的httpmodule就完成并且裝配完成了,你可以試著在你的web項目中建立一個新的webform,運行看看呢?:)
最后,我們假設(shè)一個使用這個httpmodule的場合。a站點提供免費的asp.net虛擬空間給大家,但是a站點的管理者并不想提供免費的午餐,他想要在每一個
頁面被瀏覽的時候自動彈出自己公司的廣告(就像現(xiàn)在的www.x63.com一樣),我總不能時刻監(jiān)視所有用戶的所有頁面吧,并且想要在每一個頁面手動添加
一段js代碼,工作量是不可想象的,也是不現(xiàn)實的。那末好了,只要我們的httpmodule一旦被掛接完成,這一切都將是輕而易舉的事情了,只要我們在每一個
http request被我們捕獲的時候,給他增加上一些js就好了!
我們上面提到在init()方法中使用了兩個事件beginrequest和endrequest,這兩個事件分別是init()中可以處理的所有事件的最開始事件和最終事件,在他們
中間還有一些其它的事件可以被我們利用,可以查閱msdn。
另外在我關(guān)閉editplus之前,需要敲下如下的話:
在httpmodule中可以正常使用response,request,server,application,但是不能操作任何與session有關(guān)代碼!
為什么呢?自己考慮一下吧,下回看看原因在哪里,另外再給出一個問題,你能發(fā)現(xiàn)系統(tǒng)默認的那幾個httpmodule在哪里配置的呢?找找看。
下回我們看看httphandler部分以及如何同httpmodule相配合的東東。
see you later.
(待續(xù),歡迎探討:[email protected])