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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于HttpModule

發布時間:2024/1/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于HttpModule 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
HttpModule是如何工作的

當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還并沒有對這個HTTP請求做任何處理,也就是說此時對于HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的信息在這個HTTP請求信息之上,或者針對截獲的這個HTTP請求信息作一些額外的工作,或者在某些情況下干脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。

?

示例1

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

?

namespace MyHttpModule

{

???? /// <summary>

???? /// 說明:用來實現自己的HttpModule類。

???? /// 作者:文野

???? /// 聯系:stwyhm@cnblogs.com

???? /// </summary>

???? public class MyFirstHttpModule : IHttpModule

???? {

???????? private void Application_BeginRequest(object sender, EventArgs e)

???????? {

????????????? HttpApplication application = (HttpApplication)sender;

????????????? HttpContext context = application.Context;

????????????? HttpRequest request = application.Request;

????????????? HttpResponse response = application.Response;

?

????????????? response.Write("我來自自定義HttpModule中的BeginRequest<br />");

???????? }

?

???????? private void Application_EndRequest(object sender, EventArgs e)

???????? {

????????????? HttpApplication application = (HttpApplication)sender;

????????????? HttpContext context = application.Context;

????????????? HttpRequest request = application.Request;

????????????? HttpResponse response = application.Response;

?

????????????? response.Write("我來自自定義HttpModule中的EndRequest<br />");

???????? }

?

???????? #region IHttpModule 成員

?

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

???????? {}

?

???????? public void Init(HttpApplication application)

???????? {

????????????? application.BeginRequest += new EventHandler(Application_BeginRequest);

????????????? application.EndRequest += new EventHandler(Application_EndRequest);

???????? }

?

???????? #endregion

???? }

}

Web.config進行如下配置

<add name="MyFirstHttpModule" type="MyHttpModule.MyFirstHttpModule,MyHttpModule"/>


?


深入了解
HttpModule

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

而在HttpHandler容器內部會執行ProcessRequest方法來處理HTTP請求。在容器HttpHandler處理完畢整個HTTP請求之后,會將控制權交還給HttpModuleHttpModule則會繼續對處理完畢的HTTP請求信息流進行層層的轉交動作,直到返回到客戶端為止。


1HttpModule生命周期示意圖

?

示例2:驗證HttpModule生命周期

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

?

namespace MyHttpModule

{

??? public class ValidaterHttpModule : IHttpModule

??? {

??????? #region IHttpModule 成員

?

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

??????? {}

?

??????? public void Init(HttpApplication application)

??????? {

??????????? application.BeginRequest += new EventHandler(application_BeginRequest);

??????????? application.EndRequest += new EventHandler(application_EndRequest);

??????????? application.PreRequestHandlerExecute += new EventHandler(application_PreRequestHandlerExecute);

??????????? application.PostRequestHandlerExecute += new EventHandler(application_PostRequestHandlerExecute);

??????????? application.ReleaseRequestState += new EventHandler(application_ReleaseRequestState);

??????????? application.AcquireRequestState += new EventHandler(application_AcquireRequestState);

??????????? application.AuthenticateRequest += new EventHandler(application_AuthenticateRequest);

??????????? application.AuthorizeRequest += new EventHandler(application_AuthorizeRequest);

??????????? application.ResolveRequestCache += new EventHandler(application_ResolveRequestCache);

??????????? application.PreSendRequestHeaders += new EventHandler(application_PreSendRequestHeaders);

?????????? ?application.PreSendRequestContent += new EventHandler(application_PreSendRequestContent);

??????? }

?

??????? void application_PreSendRequestContent(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

? ??????????application.Context.Response.Write("application_PreSendRequestContent<br/>");

??????? }

?

??????? void application_PreSendRequestHeaders(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

???? ???????application.Context.Response.Write("application_PreSendRequestHeaders<br/>");

??????? }

?

??????? void application_ResolveRequestCache(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

????????? ??application.Context.Response.Write("application_ResolveRequestCache<br/>");

??????? }

?

??????? void application_AuthorizeRequest(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_AuthorizeRequest<br/>");

??????? }

?

??????? void application_AuthenticateRequest(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_AuthenticateRequest<br/>");

??????? }

?

??????? void application_AcquireRequestState(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_AcquireRequestState<br/>");

??????? }

?

??????? void application_ReleaseRequestState(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_ReleaseRequestState<br/>");

??????? }

?

??????? void application_PostRequestHandlerExecute(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_PostRequestHandlerExecute<br/>");

??????? }

?

??????? void application_PreRequestHandlerExecute(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_PreRequestHandlerExecute<br/>");

??????? }

?

??????? void application_EndRequest(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

?????? ?????application.Context.Response.Write("application_EndRequest<br/>");

??????? }

?

??????? void application_BeginRequest(object sender, EventArgs e)

??????? {

??????????? HttpApplication application = (HttpApplication)sender;

??????????? application.Context.Response.Write("application_BeginRequest<br/>");

??????? }

?

???????

?

??????? #endregion

??? }

}


?

多個自定義的Http Module的運作

從運行結果可以看到,在web.config文件中引入自定義HttpModule的順序就決定了多個自定義HttpModule在處理一個HTTP請求的接管順序。注:系統默認那幾個HttpModule是最先衩ASP.NET Framework所加載上去的。

示例3:(代碼類同示例2


?


HttpModule中終止此次的HTTP請求

可以利用HttpModule通過調用HttpApplication.CompleteRequest()方法實現當滿足某一個條件時終止此次的HTTP請求。

需要注意的是,即使調用了HttpApplication.CompleteRequest()方法終止了一個HTTP請求,ASP.NET Framework仍然會觸發HttpApplication后面的這3個事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。

如果存在多個自定義的HttpModule的話,當Module1終止了一個HTTP請求,這個HTTP請求將不會再觸發Module2中相應的事件了,但Module2的最后三個事件仍會被觸發。

示例4

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

?

namespace MyHttpModule

{

??? 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

??? }

}


轉載于:https://www.cnblogs.com/systemxgl/archive/2009/09/08/1562416.html

總結

以上是生活随笔為你收集整理的关于HttpModule的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。