日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HttpModule的认识与深入理解

發(fā)布時間:2025/3/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HttpModule的认识与深入理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HttpModule是向?qū)崿F(xiàn)類提供模塊初始化和處置事件。當(dāng)一個HTTP請求到達(dá)HttpModule時,整個ASP.NET Framework系統(tǒng)還并沒有對這個HTTP請求做任何處理,也就是說此時對于HTTP請求來講,HttpModule是一個HTTP請求的“必經(jīng)之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的信息在這個HTTP請求信息之上,或者針對截獲的這個HTTP請求信息作一些額外的工作,或者在某些情況下干脆終止?jié)M足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。


首先你要實現(xiàn)IHttpModule接口這個接口只有兩個方法,一個是Init方法一個Dispose方法.

Code
using?System;

namespace?System.Web
{
????
//?Summary:
????
//?????Provides?module?initialization?and?disposal?events?to?the?implementing?class.
????public?interface?IHttpModule
????{
????????
//?Summary:
????????
//?????Disposes?of?the?resources?(other?than?memory)?used?by?the?module?that?implements
????????
//?????System.Web.IHttpModule.
????????void?Dispose();
????????
//
????????
//?Summary:
????????
//?????Initializes?a?module?and?prepares?it?to?handle?requests.
????????
//
????????
//?Parameters:
????????
//???context:
????????
//?????An?System.Web.HttpApplication?that?provides?access?to?the?methods,?properties,
????????
//?????and?events?common?to?all?application?objects?within?an?ASP.NET?application
????????void?Init(HttpApplication?context);
????}
}

?

一個HTTP請求在HttpModule容器的傳遞過程中,會在某一時刻(ResolveRequestCache事件)將這個HTTP請求傳遞給HttpHandler容器。在這個事件之后,HttpModule容器會建立一個HttpHandler的入口實例,但是此時并沒有將HTTP請求控制權(quán)交出,而是繼續(xù)觸發(fā)AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpModule窗口就會將控制權(quán)暫時交給HttpHandler容器,以便進(jìn)行真正的HTTP請求處理工作。


而在HttpHandler容器內(nèi)部會執(zhí)行ProcessRequest方法來處理HTTP請求。在容器HttpHandler處理完畢整個HTTP請求之后,會將控制權(quán)交還給HttpModule,HttpModule則會繼續(xù)對處理完畢的HTTP請求信息流進(jìn)行層層的轉(zhuǎn)交動作,直到返回到客戶端為止。


HttpModule過程在下面的事件:
BeginRequest??? 指示請求處理開始。
AuthenticateRequest PostAuthenticateRequest??? 封裝請求身份驗證過程。
AuthorizeRequest?? PostAuthorizeRequest??? 封裝請求授權(quán)過程。?
ResolveRequestCache PostResolveRequestCache??? 封裝檢查是否能利用以前緩存的輸出頁面處理請求的過程。
PostMapRequestHandler??? 指示已發(fā)現(xiàn)用于處理請求的 HTTP 處理程序。
AcquireRequestState??? PostAcquireRequestState??? 封裝對請求會話狀態(tài)的檢索。
PostRequestHandlerExecute??? 指示用于處理請求的 HTTP 處理程序已執(zhí)行。
ReleaseRequestState?? PostReleaseRequestState??? 封裝對請求會話狀態(tài)的發(fā)布。
UpdateRequestCache??? PostUpdateRequestCache??? 封裝檢查是否應(yīng)對請求的資源的輸出進(jìn)行緩存以備今后重復(fù)使用的過程。
EndRequest??? 指示請求處理結(jié)束。

?

可以利用HttpModule通過調(diào)用HttpApplication.CompleteRequest()方法實現(xiàn)當(dāng)滿足某一個條件時終止此次的HTTP請求。需要注意的是,即使調(diào)用了HttpApplication.CompleteRequest()方法終止了一個HTTP請求,ASP.NET Framework仍然會觸發(fā)HttpApplication后面的這3個事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。
如果存在多個自定義的HttpModule的話,當(dāng)Module1終止了一個HTTP請求,這個HTTP請求將不會再觸發(fā)Module2中相應(yīng)的事件了,但Module2的最后三個事件仍會被觸發(fā)。

Code
public?class?CompleteRequestHttpModule?:?IHttpModule
????{
????????
#region?IHttpModule?成員
?????????
public?void?Dispose()
????????{}?

????????
public?void?Init(HttpApplication?application)
????????{
????????????application.BeginRequest?
+=?new?EventHandler(Application_BeginRequest);
????????}?

????????
void?Application_BeginRequest(object?sender,?EventArgs?e)
????????{
????????????HttpApplication?application?
=?(HttpApplication)sender;
????????????application.CompleteRequest();
????????????application.Context.Response.Write(
"請求被終止。");
????????}?
????????
#endregion
????}


HttpModule示例:

?過濾http請求

Code
????///?<summary>
????
///?頁面訪問驗證模塊
????
///?</summary>
????public?class?AuthenticationModule?:?IHttpModule
????{
????????
#region?IHttpModule?Members

????????
public?void?Dispose()
????????{
????????}

????????
public?void?Init(HttpApplication?context)
????????{
????????????context.AcquireRequestState?
+=?new?EventHandler(context_AcquireRequestState);
????????}

????????
#endregion

????????
private?void?context_AcquireRequestState(object?sender,?EventArgs?e)
????????{
????????????HttpContext?context?
=?HttpContext.Current;
????????????
string?path?=?context.Request.Path.ToLower();
????????????
//?只處理aspx文件,因為其他文件無法獲得Session對象,無法判斷是否已經(jīng)登錄
????????????if?(path.EndsWith(".aspx"))
????????????{
????????????????
//?如果用戶沒有登錄就會返回false
????????????????if?(!UserRules.Instance.IsCurrentUserLogined)
????????????????{
????????????????????
//?對于公共文件夾和根目錄的文件不做判斷
????????????????????if?(path.StartsWith("/"?+?AppSettings.PUBLICFOLDERNAME?+?"/")==false?&&?!(path.LastIndexOf("/")?==?0))
????????????????????{
????????????????????????
//?跳轉(zhuǎn)到公共頁面首頁????????????????????????
????????????????????????context.Response.Redirect(AppSettings.PUBLICLOGOUTFILENAME,?false);
????????????????????????context.ApplicationInstance.CompleteRequest();
????????????????????}
????????????????}
????????????}
????????}
????}

在web.confg中添加httpModules節(jié)點注冊事件
<httpModules>
???? <add name="AuthenticationModule" type="Business.AuthenticationModule, Business"/>
</httpModules>

?
判斷瀏覽器的版本?

Code
using?System;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.Security;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Web.UI.WebControls.WebParts;
using?System.Web.UI.HtmlControls;

///?<summary>
///?BrowserModule?的摘要說明
///?</summary>
public?class?BrowserModule?:?IHttpModule
{
????
public?BrowserModule()
????{
????????
//
????????
//?TODO:?在此處添加構(gòu)造函數(shù)邏輯
????????
//
????}

????
#region?IHttpModule?成員

????
public?void?Dispose()
????{

????}

????
public?void?Init(HttpApplication?context)
????{
????????
//添加判斷事件
????????context.BeginRequest?+=?new?EventHandler(context_BeginRequest);
????????context.EndRequest?
+=?new?EventHandler(context_EndRequest);
????}

????
void?context_EndRequest(object?sender,?EventArgs?e)
????{
????????
if?(isfalse)
????????{
????????????HttpApplication?application?
=?(HttpApplication)sender;
????????????application.Context.Response.Clear();
//清空瀏覽器所有的內(nèi)容
????????????application.Context.Response.Output.Write("瀏覽器不符合要求");
????????}

????}
????
public?bool?isfalse?=?false;//判斷瀏覽器是否符合要求
????void?context_BeginRequest(object?sender,?EventArgs?e)
????{
????????HttpApplication?application?
=?(HttpApplication)sender;//獲得實際發(fā)生事件的對象
????????HttpBrowserCapabilities?browser?=?application.Context.Request.Browser;//獲得瀏覽器的相關(guān)信息
????????
//獲得瀏覽器的名字??application.Context.Response.Output.Write(browser.Browser);
????????
//獲得瀏覽器的版本號?application.Context.Response.Output.Write(browser.MajorVersion?);
????????if?(browser.Browser?!=?"IE"?||?browser.MajorVersion?<?7)//判斷瀏覽器的版本是否是IE5以上的
????????{
????????????
string?strBrowserChooserPage?=?"";//創(chuàng)建變量裝載瀏覽器不符合條件后要導(dǎo)入的頁面
????????????try
????????????{
????????????????strBrowserChooserPage?
=?ConfigurationManager.AppSettings["BrowserChooserPage"];//從配置文件中導(dǎo)入要瀏覽的頁面
????????????}
????????????
catch?(System.Configuration.ConfigurationErrorsException?ex)
????????????{
????????????????
throw?new?Exception(string.Format("請正確配置web.config?AppSetting[BrowserChooserPage]節(jié)點,系統(tǒng)錯誤提示:{0}",?ex.Message));
????????????}
????????????
catch?(System.Exception?ex)
????????????{
????????????????
throw?ex;
????????????}
????????????isfalse?
=?true;//為True的時候瀏覽器不符合要求,處理完context_BeginRequest事件后,最好在處理context_EndRequest事件的時候判斷是否合適
????????}
????????
else
????????{
?????????
????????????application.Context.Response.Output.Write(
"瀏覽器符合要求");
????????}
????}
????
#endregion
}

注冊web.config事件

實現(xiàn)URL重寫

Code
using?System;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.Security;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Web.UI.WebControls.WebParts;
using?System.Web.UI.HtmlControls;

///?<summary>
///?UrlReWriteHttpModule?的摘要說明
///?</summary>
public?class?UrlReWriteHttpModule?:?IHttpModule
{
????
public?UrlReWriteHttpModule()
????{
????????
//
????????
//?TODO:?在此處添加構(gòu)造函數(shù)邏輯
????????
//
????}

????
#region?IHttpModule?成員

????
public?void?Dispose()
????{
????????
throw?new?Exception("The?method?or?operation?is?not?implemented.");
????}

????
public?void?Init(HttpApplication?context)
????{
????????context.BeginRequest?
+=?new?EventHandler(context_BeginRequest);
????}

????
void?context_BeginRequest(object?sender,?EventArgs?e)
????{
????????HttpContext?context?
=?(sender?as?HttpApplication).Context;
????????
//string?Url1?=?context.Request.Path;
????????
//string?Url2?=?context.Request.PathInfo;
????????
//string?Url3?=?context.Request.Url.ToString();
????????
//得到整個的網(wǎng)絡(luò)地址
????????string?fullOrigionalpath?=?context.Request?.Url.ToString();

????????
if?(fullOrigionalpath.Contains("/Books.aspx"))
????????{
????????????context.RewritePath(
"Products.aspx?Category=Books");//重寫地址,重寫后地址欄中的顯示不變,但是真正返回的頁面是被重寫的頁面
????????}
????????
else?if?(fullOrigionalpath.Contains("/DVDs.aspx"))
????????{
????????????context.RewritePath(
"Products.aspx?Category=DVDs");
????????}
????????
else?if?(fullOrigionalpath.Contains("/DVDs.aspx"))
????????{
????????????context.RewritePath(
"Products.aspx?Category=CDs.aspx");
????????}
????}

????
#endregion
}

?注冊web.config事件

-------------------------------------------------完成------------------------------------------------

從上面的例子看出,其實是一個好簡單的實現(xiàn)方法,就是在init中注冊處理過程事件,把代碼寫完后,在web.congif中HttpModules注冊就完成了.

開發(fā)程序千變?nèi)f變, 通過這一方法可以編寫出好多合適自己用的功能,這需要大家去實踐了. 收集與整理,且當(dāng)成長的回憶.

轉(zhuǎn)載于:https://www.cnblogs.com/tangself/archive/2009/12/29/1634949.html

總結(jié)

以上是生活随笔為你收集整理的HttpModule的认识与深入理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。