久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

初窺asp.net Runtime之二

 賈朋亮博客 2011-11-04

上篇地址http://www.cnblogs.com/wmj/archive/2008/03/03/1088298.html
    上一篇中,,通過實(shí)現(xiàn)
IHttpModule接口,,就看到網(wǎng)頁(yè)上輸出了兩句話,,這是怎么回事呢?先別急,,通過反射,,先看看HttpApplication到底定義了那些事件!

My god,,這么多事件,!

在此,先弄清楚一個(gè)先后順序問題,,向IHttpModule訂閱的事件處理方法,并不一定優(yōu)先于IHttpHandler的方法先執(zhí)行,,比如IHttpHandler.ProcessRequest方法優(yōu)先于IHttpModule.EndRequest事件處理方法,,這很明顯!在HttpModule中的主要任務(wù)就是向HttpApplication發(fā)出訂閱,,至于訂閱的處理方法,,什么時(shí)候執(zhí)行,得看請(qǐng)求執(zhí)行到了哪里,,所以如果要實(shí)現(xiàn)自定義的IHttpModule,,只要做兩件事;訂閱和實(shí)現(xiàn)訂閱的處理方法?。ㄖx謝Cat Chen的提醒)

在上一篇中,,我只實(shí)現(xiàn)了BeginRequestEndRequest方法,看看系統(tǒng)中是怎樣定義的
// 摘要:
//     ASP.NET 響應(yīng)請(qǐng)求時(shí)作為 HTTP 執(zhí)行管線鏈中的第一個(gè)事件發(fā)生,。
EndRequest定義
// 摘要:
//     ASP.NET 響應(yīng)請(qǐng)求時(shí)作為 HTTP 執(zhí)行管線鏈中的最后一個(gè)事件發(fā)生,。

至于HttpApplication的其他方法,在后面的環(huán)節(jié)中再說,。

    這時(shí)候,,突然想到一件事,那時(shí)我剛接觸網(wǎng)絡(luò),,朋友幫我申請(qǐng)了一個(gè)免費(fèi)的空間,,我做了一個(gè)人主頁(yè)放到空間里!出了一怪事(當(dāng)時(shí)認(rèn)為),,在我的個(gè)人主頁(yè)的頁(yè)眉和頁(yè)腳上,,莫名其妙的被別人加上了一些情色廣告!當(dāng)時(shí)很納悶,,怎么也弄不掉那些廣告,,但是查看html的源文件,壓根看不到任何異常的demo!后來(lái)才知道運(yùn)營(yíng)商為了自己的利益,,在IHttpModule模塊上做了手腳,!

 (HttpModule應(yīng)用)還是動(dòng)手做一個(gè)Moduled的例子吧!

曾經(jīng)看到園子中有朋友,,在自定義的Module中,,訂閱了授權(quán)事件HttpApplication.OnAuthorizeRequest,然后在授權(quán)事件的處理方法中,從Session[“key”]集合中獲取用戶標(biāo)識(shí)ID,,并和當(dāng)前請(qǐng)求的用戶標(biāo)識(shí)ID比較,,如果與Session[“key”]集合中的用戶標(biāo)識(shí)ID相同,就授權(quán),,不同或者沒有用戶標(biāo)識(shí)ID,,就不授權(quán),!當(dāng)然,這種基于URL授權(quán)的想法不錯(cuò),!

但是,,有幾點(diǎn)需要考慮到!(說明不是針對(duì)那為朋友,,只是找個(gè)案例罷了......)
    
一,,OnAuthorizeRequest事件的處理方法中,session集合還沒有生成,,又怎能取值呢,?

    
二,從數(shù)據(jù)庫(kù)中查找用戶ID,,性能肯定有損耗,,有人可能會(huì)想到,我只在登錄的時(shí)候查詢一次數(shù)據(jù)庫(kù),,然后保存起來(lái),,哈哈,不過還是有點(diǎn)麻煩,,因?yàn)榇藭r(shí)cachesession等都不能用,,只有application可以使用,難道把用戶ID保存在HttpApplication對(duì)象里嗎,?(HttpApplication不是隔離的,,怎感覺不妥)

三,解決辦法,,目前只是猜想,,哈哈,思路是這樣的,!
HttpApplication. OnAuthorizeRequest事件的處理方法之前,,或者之中,想辦法提前獲取請(qǐng)求關(guān)聯(lián)的狀態(tài),,這里指會(huì)話狀態(tài)(session),!哈哈

現(xiàn)在,我就在OnAuthorizeRequest事件的處理方法中,,做一些簡(jiǎn)單的處理,,判斷請(qǐng)求的類型,,如果不為get或者post類型,,就終止這個(gè)Http管道中的其他事件,直接跳到EndRequest事件,!

配置,,就不說了

class AuthorHttpModule : System.Web.IHttpModule//, IRequiresSessionState
{
    
public AuthorHttpModule()
    
{ }
    
public void Init(System.Web.HttpApplication application)
    
{
        
application.AuthorizeRequest += new EventHandler(this.OnAuthorize);
        
application.AcquireRequestState += new EventHandler(application_AcquireRequestState);
    
}
    
public void OnAuthorize(Object sender,EventArgs e)
    
{
        
HttpApplication application = (HttpApplication)sender;
        
HttpContext context = application.Context;
        
HttpRequest request = context.Request;
        
HttpResponse response = context.Response;
        
string type = request.HttpMethod;
        
if (type.ToLower() == "get" || type.ToLower() == "post")
        
{ }
        
else
        
{
            
application.CompleteRequest();
            
response.StatusCode = 500;
            
response.StatusDescription = "SORRY,,Request's type must be Get or Post!";
        
}
        
HttpApplicationState app1=context.Application;
        
HttpApplicationState app2 = application.Application;
        
App1["app1"] = "appValue1";
        
App2["app2"] = "appValue2";
        
HttpSessionState sessionState = context.Session;
        
//sessionState["ss1"] = "sss";//here ,throw Exception object
    
}
    
void application_AcquireRequestState(object sender, EventArgs e)
    
{
        
HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;
        HttpSessionState sessionState = context.Session;
        sessionState["ss"] = "ssValue";
    }
    public void Dispose()
    { }
}

說明;
    一,application.CompleteRequest()方法終止這個(gè)Http管道中的其他事件,,直接跳到EndRequest事件,!然后設(shè)置響應(yīng)的狀態(tài)代碼為500

二,,HttpApplicationState app1=context.ApplicationHttpApplicationState app2 = application.Application;方法都是獲取服務(wù)器的HttpApplicationState集合,!而且,在授權(quán)事件中可以獲取或者設(shè)置,,但是HttpSessionState集合不行?。ǖ窃?/SPAN>AcquireRequestState事件中可以獲取或者設(shè)置HttpSessionState集合)!

最后;

    雖然application.CompleteRequest()方法終止了Http管道中的其他事件,,直接跳到EndRequest事件,,但是后面的application.PreSendRequestHeadersapplication.PreSendRequestContent事件仍然會(huì)執(zhí)行,不信試試,!    
    雖然我們自定義了自己的Module,但并不會(huì)覆蓋系統(tǒng)默認(rèn)的Module,順序是先系統(tǒng)的,,后自己定義的,如果想完全清除系統(tǒng)的Module,,在configremove掉對(duì)應(yīng)的項(xiàng)就OK,!

    有不妥之處,還望指教,!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多