<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ASP.NET底層機制 (上) HttpModule

      1.ASP時代的HTTP請求處理過程

      在IIS的應用程序映射中,IIS會將對asp和asa文件的請求轉交給asp.dll這個ISAPI來處理

      Inetinfo.exe進程,即www服務進程
      解釋型處理,每次請求都會重新解釋一次,不適用于大流量請求

      2.ASP.NET的HTTP請求處理過程



      3.在HttpRuntime中請求處理過程
      HttpRequest請求:
      進入HttpRumtime——通過HttpApplicationFactory,建立HttpApplication實例——進入HttpModule——通過HttpHandlerFactory,建立HttpHandler實例
          *這個HttpApplication實例在HttpModule的Init方法中會用到

      4.HttpModule工作原理
      負責監聽HttpRequest,同時對HttpRequest增添或者過濾掉一部分內容。
      HttpModule實現了接口IHttpModule,我們可以自定義實現該接口的類,從而取代HttpModule。
      ASP.NET默認的HttpModule如下:
              System.Web.SessionState.SessionStateModule;
              System.Web.Security.WindowsAuthenticationModule;
              System.Web.Security.FormsAuthenticationModule;
              System.Web.Security.PassportAuthenticationModule;
              System.Web.Security.UrlAuthorizationModule;
              System.Web.Security.FileAuthorizationModule;

      IHttpModule接口分析:
      public interface IHttpModule
      {
          
      // 銷毀不再被HttpModule使用的資源
          void Dispose();

          
      //初始化一個Module,為捕獲HttpRequest做準備
          void Init(HttpApplication context);
      }

      編寫自己的HttpModule:
      //注意要在這個類庫中添加System.Web引用
      using System;
      using System.Web;

      namespace ClassLibraryModule
      {
          
      public class MyHttpModule : IHttpModule
          
      {
              
      public void Init(HttpApplication context)
              
      {
                  context.BeginRequest 
      += new EventHandler(this.Application_BeginRequest);
                  context.EndRequest 
      += new EventHandler(this.Application_EndRequest);
              }


              
      public void Dispose() { }


              
      //自己要處理私事的兩個方法
              public void Application_BeginRequest(Object sender, EventArgs e)
              
      {
                  HttpApplication application 
      = (HttpApplication)sender;

                  HttpContext context 
      = application.Context;
                  HttpResponse response 
      = application.Response;
                  HttpRequest request 
      = application.Request;

                  response.Write(
      "來自Application_BeginRequest");
              }


              
      public void Application_EndRequest(Object sender, EventArgs e)
              
      {
                  HttpApplication application 
      = (HttpApplication)sender;

                  HttpContext context 
      = application.Context;
                  HttpResponse response 
      = application.Response;
                  HttpRequest request 
      = application.Request;

                  response.Write(
      "來自Application_EndRequest");
              }

          }

      }

      在Web項目中添加這個類庫的引用,同時在Web.config的system.web標簽中添加:
              <httpModules>
                  
      <add name="Test" type="ClassLibraryModule.MyHttpModule,ClassLibraryModule"></add>
              
      </httpModules>

      name可以隨意指定,沒有影響。
      type有兩個參數,第一個表示具體哪個類,第二個表示是哪個dll

      不需要在Web項目添加對類庫的引用,只是復制一份到bin目錄下即可

      于是該站點下的每個頁面都會Response.Write兩句話——這適合做廣告,只要替換成javascript即可

      5.HttpModule內部事件機制
      HttpApplication實例有很多事件,BenginRequest和EndRequest分別是HttpModule容器最開始的和最后的事件


      注意,EndRequest之后還會觸發PreSendRequestHeaders事件和PreSendRequestContent事件,這不是在HttpModule外的兩個事件,表示HttpModule結束,即將開始向Client發送數據。

      HttpModule容器與HttpHandler容器的交互:
          HttpModule容器會將HttpRequest傳遞到HttpHandler容器,這個時間點是ResolveRequestCache事件。
          HttpModule容器會建立HttpHandler實例作為入口——Session從此生效
          觸發AcquireRequestState事件以及PreRequestHandlerExecute事件,
          HttpModule容器便將對HttpRequest的控制權轉讓給HttpHandler容器。
          HttpHandler容器處理HttpRequest——使用自身的ProcessRequest方法,將對其控制權又還給HttpModule容器——之后Session失效


      可以同時加載兩個HttpModule,

              <httpModules>
                  
      <add name="Test1" type="ClassLibraryModule.MyHttpModule1,ClassLibraryModule1"></add>
                  
      <add name="Test2" type="ClassLibraryModule.MyHttpModule2,ClassLibraryModule2"></add>
              
      </httpModules>

      這時,根據add標簽的先后,依次執行:
          Test1.BeginRequest
          Test2.BeginRequest
          .....
          Test1.EndRequest
          Test2.EndRequest

      利用HttpModule實現當滿足一定條件時終止此次HttpRequest:
      在BeginRequest事件中,使用HttpApplication.CompleteRequest()方法

              public void Application_BeginRequest(Object sender, EventArgs e)
              
      {
                  HttpApplication application 
      = (HttpApplication)sender;
                  HttpContext context 
      = application.Context;

                  application.CompleteRequest();

                  context.Response.StatusCode 
      = 500;
                  context.Response.StatusDescription 
      = "Internal Server Error";
              }

      在BeginRquest中終止,但是仍然會調用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件——應該說直接跳轉到EndRequest事件,而不會調用這期間的事件
      如果有兩個HttpModule,在第一個Module的BeginRequest中終止,僅僅不會調用第二個Module的BeginRequest,但仍然會調用兩個EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。

      以上兩句話,可以用下圖來表示:



      posted @ 2007-10-02 11:19  包建強  Views(6807)  Comments(9)    收藏  舉報
      主站蜘蛛池模板: 亚洲日韩在线中文字幕第一页 | 一本色道国产在线观看二区| 忘忧草影视| 日韩精品久久久肉伦网站| 亚洲精品一区二区三区大| 国产精品亚洲а∨天堂2021 | 亚洲欧美在线观看品| 国产区精品视频自产自拍| 国产美女被遭强高潮免费一视频| 欧美白妞大战非洲大炮| 亚洲国产综合性亚洲综合性| 精品国产欧美一区二区三区在线 | 国产精品户外野外| 亚洲高清有码在线观看| 亚洲一区成人在线视频| av色蜜桃一区二区三区| 97精品伊人久久久大香线蕉| 少妇宾馆粉嫩10p| 一区二区三区四区黄色片| 国产高清精品在线91| 江都市| 国产精品亚洲二区在线播放 | 亚洲精品一区二区二三区| 欧美亚洲另类自拍偷在线拍| 久久亚洲精品中文字幕波多野结衣 | 国产一卡2卡三卡4卡免费网站| 吐鲁番市| 99热精品国产三级在线观看| 夜夜添无码一区二区三区| 久久精品无码av| 中文字幕日本六区小电影| 日本亚洲欧洲免费无线码| 久久精品这里热有精品| 国产卡一卡二卡三免费入口| 55夜色66夜色国产精品视频| 欧美成人午夜在线观看视频| 亚洲天堂亚洲天堂亚洲天堂| 亚洲国产大胸一区二区三区| 乱码中字在线观看一二区| 国产成人午夜福利院| 国产亚洲精品在av|