<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • ASP.NET架構(gòu)及開發(fā)技術(shù)詳解教程

    時間:2024-08-09 04:45:14 ASP 我要投稿
    • 相關(guān)推薦

    ASP.NET架構(gòu)及開發(fā)技術(shù)詳解教程

      首先我們來說一下Asp.net工作原理。

      具體描述下這樣的:首先客戶請求WEB頁。然后WEB服務(wù)尋找指令文件(.aspx),而這時就是aspnet_isapi.dll這個動態(tài)連接庫來處理。接著Asp.net代碼被發(fā)送到公共語言運(yùn)行時進(jìn)行編譯。接著HTML流返回給瀏覽器和令。最后由瀏覽器處理HTML并顯示頁面。

      什么是ISAPI呢?

      在Internet時代的開端,客戶端的需求非常有限;.htm文件就可以滿足他們的需求。但是,隨著時間的流逝,客戶端需求的擴(kuò)充超越了.htm文件或靜態(tài)文件所包含的功能。

      開發(fā)者需要擴(kuò)充或擴(kuò)展Web服務(wù)器的功能。Web服務(wù)器廠商設(shè)計了不同的解決方案,但是都遵循同一個主題“向Web服務(wù)器插入某些組件”。所有的Web服務(wù)器補(bǔ)充技術(shù)都允許開發(fā)者建立并插入組件以增強(qiáng)Web服務(wù)器的功能。微軟公司提出了ISAPI(Internet服務(wù)器API),網(wǎng)景公司提出了 NSAPI(網(wǎng)景服務(wù)器API)等等。ISAPI是一種重要的技術(shù),它允許我們增強(qiáng)與ISAPI兼容的Web服務(wù)器(IIS就是一種與ISAPI兼容的 Web服務(wù)器)的能力。我們使用下面的組件達(dá)到這個目的:

      1,ISAPI擴(kuò)展:ISAPI擴(kuò)展是使用Win32動態(tài)鏈接庫來實現(xiàn)的。你可以把ISAPI擴(kuò)展看作是一個普通的應(yīng)用程序。ISAPI擴(kuò)展的處理目標(biāo)是http請求。

      2,ISAPI過濾器:客戶端每次向服務(wù)器發(fā)出請求的時候,請求要經(jīng)過過濾器。客戶端不需要在請求中指定過濾器,只需要簡單地把請求發(fā)送給Web服務(wù)器,接著Web服務(wù)器把請求傳遞給相關(guān)的過濾器。接下來過濾器可能修改請求,執(zhí)行某些登錄操作等等。

      ASP.NET請求的處理過程:

      ASP.NET請求處理過程是基于管道模型的,在模型中ASP.NET把http請求傳遞給管道中的所有模塊。每個模塊都接收http請求并有完全控制權(quán)限。模塊可以用任何自認(rèn)為適合的方式來處理請求。一旦請求經(jīng)過了所有HTTP模塊,就最終被HTTP處理程序處理。HTTP處理程序?qū)φ埱筮M(jìn)行一些處理,并且結(jié)果將再次經(jīng)過管道中HTTP模塊。

      ISAPI的篩選器:

      IIS本身是不支持動態(tài)頁面的,也就是說它僅僅支持靜態(tài)html頁面的內(nèi)容,對于如.asp,.aspx,.cgi,.php等,IIS并不會處理這些標(biāo)記,它就會把它當(dāng)作文本,絲毫不做處理發(fā)送到客戶端。為了解決這個問題。IIS有一種機(jī)制,叫做ISAPI的篩選器,它是一個標(biāo)準(zhǔn)組件(COM組件)。

      Asp.net服務(wù)在注冊到IIS的時候,會把每個擴(kuò)展可以處理的文件擴(kuò)展名注冊到IIS里面(如:*.ascx、*.aspx等)。擴(kuò)展啟動后,就根據(jù)定義好的方式來處理IIS所不能處理的文件,然后把控制權(quán)跳轉(zhuǎn)到專門處理代碼的進(jìn)程中讓這個進(jìn)程開始處理代碼,生成標(biāo)準(zhǔn)的HTML代碼,生成后把這些代碼加入到原有的Html中,最后把完整的Html返回給IIS,IIS再把內(nèi)容發(fā)送到客戶端。

      HttpModule:

      HttpModule實現(xiàn)了ISAPI Filter的功能,是通過對IhttpModule接口的繼承來處理。

      HTTP模塊是實現(xiàn)了System.Web.IhttpModule接口的.NET組件。這些組件通過在某些事件中注冊自身,把自己插入ASP.NET請求處理管道。當(dāng)這些事件發(fā)生的時候,ASP.NET調(diào)用對請求有興趣的HTTP模塊,這樣該模塊就能處理請求了。

      HttpModule的實現(xiàn):

      1. 編寫一個類,實現(xiàn)IhttpModule接口。

      2. 實現(xiàn)Init 方法,并且注冊需要的方法。

      3. 實現(xiàn)注冊的方法。

      4. 實現(xiàn)Dispose方法,如果需要手工為類做一些清除工作,可以添加Dispose方法的實現(xiàn),但這不是必需的,通?梢圆粸镈ispose方法添加任何代碼。

      5. 在Web.config文件中,注冊您編寫的類。

      下邊我們來看例子,HttpModule的實現(xiàn):

      首先添加一個類庫,然后在引用里引用System.Web和System.Security這兩個命名空間。然后寫個類,代碼如下:

      using System;

      using System.Collections.Generic;

      using System.Text;

      using System.Web;

      using System.Security.Principal;

      namespace Httplibrary

      {

      public class SecurityModules:IHttpModule

      {

      public void Init(HttpApplication r_objApplication)

      {

      // 向Application 對象注冊事件處理程序,核心部分。

      r_objApplication.AuthenticateRequest += new EventHandler(this.AuthenticateRequest) ;

      }

      public void Dispose()

      {

      }

      private void AuthenticateRequest(object r_objSender,EventArgs r_objEventArgs)

      {

      // 鑒別用戶的憑證,并找出用戶角色。

      HttpApplication objApp = (HttpApplication) r_objSender ;

      HttpContext objContext = (HttpContext) objApp.Context ;

      if ( (objApp.Request["userid"] == null) ||(objApp.Request["password"] == null) )

      {

      objContext.Response.Write("用戶名和密碼為空,驗證失!") ;

      objContext.Response.End() ;

      }

      string userid = "" ;

      userid = objApp.Request["userid"].ToString() ;

      string password = "" ;

      password = objApp.Request["password"].ToString() ;

      string[] strRoles ;

      strRoles = AuthenticateAndGetRoles(userid, password) ;

      if ((strRoles == null) || (strRoles.GetLength(0) == 0))

      {

      objContext.Response.Write("用戶名或密碼錯誤!") ;

      objApp.CompleteRequest() ;//終止一個Http請求

      }

      GenericIdentity objIdentity = new GenericIdentity(userid,"CustomAuthentication") ;

      objContext.User = new GenericPrincipal(objIdentity, strRoles) ;

      }

      private string[] AuthenticateAndGetRoles(string r_strUserID,string r_strPassword)

      {

      string[] strRoles = null ;

      if ((r_strUserID.Equals("Zhangsan")) && (r_strPassword.Equals("111")))

      {

      strRoles = new String[1] ;

      strRoles[0] = "Administrator" ;

      }

      else if ((r_strUserID.Equals("Lisi")) && (r_strPassword.Equals("222")))

      {

      strRoles = new string[1] ;

      strRoles[0] = "User" ;

      }

      return strRoles ;

      }

      }

      }

      編譯一下,下邊做測試頁面,很簡單,放一個label,text=“測試頁面”如果成功則顯示測試頁面。然后在web.config里面配置,這里很重要。添加 注意注釋部分。

      然后添加 這個節(jié)點,這個大家應(yīng)該都能明白。

      然后啟動測試頁面。剛啟動開始后頁面一定顯示“用戶名和密碼為空,驗證失敗!”呵呵,別忘記了咱們這就是目的,然后在你的地址欄后邊添加?userid= Zhangsan&password=111這行字。然后就會顯示“測試頁面”這幾個字。大家可以多輸入幾個名字單步調(diào)試一下就明白了。

      WebConfig設(shè)置

      <add type=“classname,assemblyname”

      name=“modulename”/>

      子標(biāo)記說明:

      將HttpModule 類添加到應(yīng)用程序。請注意,如果以前已指定了相同的謂詞/路徑組合(例如在父目錄的Web.config 文件中),則對的第二個調(diào)用將重寫以前的設(shè)置。

      從應(yīng)用程序移除HttpModule 類。

      從應(yīng)用程序移除所有HttpModule 映射。

      深入研究HttpModule

      HttpModule通過對HttpApplication對象的一系列事件的處理來對HTTP處理管道施加影響,這些事件在HttpModule的Init方法中進(jìn)行注冊,包括:

      BeginRequest

      AuthenticateRequest

      AuthorizeRequest

      ResolveRequestCache

      AcquireRequestState

      PreRequestHandlerExecute

      PostRequestHandlerExecute

      ReleaseRequestState

      UpdateRequestCache

      EndRequest

      我們都可以對以上事件進(jìn)行重新定義,注意時重新定義不時覆蓋。我們看一個例子,多個HttpModule的實現(xiàn),建立兩個類庫,什么都相同就是類名不相同,引入相應(yīng)的命名空間后我們編寫這個類,代碼如下:

      using System;

      using System.Collections.Generic;

      using System.Text;

      using System.Web;

      namespace HttpModuleTest1

      {

      public class Test1Module:IHttpModule

      {

      public Test1Module()

      {

      }

      public string ModuleName

      {

      get

      {

      return "Test1Module";

      }

      }

      public void Init(HttpApplication application)

      {

      application.BeginRequest += new EventHandler(myBeginRequest);

      application.EndRequest += new EventHandler(myEndRequest);

      application.PreRequestHandlerExecute += new EventHandler(myPreRequestHandlerExecute);

      application.PostRequestHandlerExecute += new EventHandler(myPostRequestHandlerExecute);

      application.ReleaseRequestState += new EventHandler(myReleaseRequestState);

      application.AcquireRequestState += new EventHandler(myAcquireRequestState);

      application.AuthenticateRequest += new EventHandler(myAuthenticateRequest);

      application.AuthorizeRequest += new EventHandler(myAuthorizeRequest);

      application.ResolveRequestCache += new EventHandler(myResolveRequestCache);

      application.PreSendRequestHeaders += new EventHandler(myPreSendRequestHeaders);

      application.PreSendRequestContent += new EventHandler(myPreSendRequestContent);

      }

      private void myBeginRequest(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Beggining of Request

      ");

      }

      private void myEndRequest(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:End of Request

      ");

      }

      private void myPreRequestHandlerExecute(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_RequestHandlerExecute:

      ");

      }

      private void myPostRequestHandlerExecute(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_PostRequestHandlerExecute:

      ");

      }

      private void myReleaseRequestState(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_ReleaseRequestState:

      ");

      }

      private void myAcquireRequestState(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_ReleaseRequestState:

      ");

      }

      private void myAuthenticateRequest(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_AuthenticateRequest:

      ");

      }

      private void myAuthorizeRequest(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_AuthorizeRequest:

      ");

      }

      private void myResolveRequestCache(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_ResolveRequestCache:

      ");

      }

      private void myPreSendRequestHeaders(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_PreSendRequestHeaders:

      ");

      }

      private void myPreSendRequestContent(object source, EventArgs e)

      {

      HttpApplication application = (HttpApplication)source;

      HttpContext context = application.Context;

      context.Response.Write("Test1Module:Application_PreSendRequestContent:

      ");

      }

      public void Dispose()

      {

      }

      }

      }

      然后在web.config里添加,不明白的看注釋部分。

      還是用剛才那個測試頁面,我們就可以觀察到兩個test的執(zhí)行順序。

      我們具體分析一下就是這樣的:

      HttpRequest開始->進(jìn)入HttpModule->HttpModule->

      首次截獲HttpRequest->HttpModule.BeginRequest->

      HttpModule.AuthorizeRequest->HttpModule.ResolveRequestCache->

      初始化HttpHandler->建立HttpHandler控制點->HttpModule繼續(xù)處理。HttpHandler已經(jīng)建立,此后Session可用->HttpModule.AcquireRequestState

      ->HttpModule.PreRequestHandlerExecute->進(jìn)入HttpHandler處理HttpRequest

      ->HttpHandler->HttpHandler.ProcessRequest->返回HttpModule, HttpHandler結(jié)束,Session失效->HttpModule.PostRequestHandlerExecute-> HttpModule.ReleaseRequestState->

      HttpModule.UpdateRequestCache->HttpModule.EndRequest->HttpModule.PreSendRequestHeaders->HttpModule.PreSendRequestContent->

      將處理的數(shù)據(jù)返回客戶端,處理結(jié)束。

      HttpHandler:

      HttpHandler實現(xiàn)了ISAPI Extention的功能,他處理請求(Request)的信息和發(fā)送響應(yīng)(Response)。HttpHandler功能的實現(xiàn)通過實現(xiàn)IHttpHandler接口來達(dá)到。

      HTTP處理程序是實現(xiàn)了System.Web.IHttpHandler接口的.NET組件。任何實現(xiàn)了IHttpHandler接口的類都可以用于處理輸入的HTTP請求。HTTP處理程序與ISAPI擴(kuò)展有些類似。HTTP處理程序和ISAPI擴(kuò)展的差別在于在URL中可以使用HTTP處理程序的文件名稱直接調(diào)用它們,與ISAPI擴(kuò)展類似。

      HttpHandler的實現(xiàn),實現(xiàn)我們的HTTP處理程序包含以下步驟:

      編寫一個實現(xiàn)IHttpHandler接口的類。

      在web.config或machine.config文件中注冊這個處理程序。

      在Internet服務(wù)管理器中把文件擴(kuò)展(你想要處理的文件擴(kuò)展名)映射到ASP.NETISAPI擴(kuò)展DLL(aspnet_isapi.dll)上。

      我們來看一個例子,打開IIS服務(wù)器,屬性,主目錄下有個配置,里面你就可以找到你的程序所執(zhí)行文件所要調(diào)用的.dll文件。我們可以看到.aspx就是 C:WINDOWSMicrosoft.NETFramework 2.0.50727aspnet_isapi.dll這個文件

      來執(zhí)行的。這里還可以添加你自己任意定義任意擴(kuò)展名文件,定義了后你的服務(wù)器就可以認(rèn)識這些人間,注意只是你的服務(wù)器,別人的不認(rèn)識。這時候大家就會對網(wǎng)絡(luò)上流行的各式各樣的后綴名不奇怪了吧,可以自己定義的。

      我們自己定義一個帶.xxx后綴的。

      添加一個類庫,引用的相應(yīng)的命名空間,

      using System;

      using System.Collections.Generic;

      using System.Text;

      using System.Web;

      namespace MyHandler

      {

      public class NewHandler:IHttpHandler

      {

      public NewHandler()

      {

      // TODO: 此處添加構(gòu)造邏輯

      }

      Implementation of IHttpHandler#region Implementation of IHttpHandler

      /**////

      /// http處理程序的核心。我們調(diào)用這個方法來處理http請求。

      ///

      ///

      public void ProcessRequest(System.Web.HttpContext context)

      {

      HttpResponse objResponse = context.Response;

      objResponse.Write("

      Hello xxx ! ");

      objResponse.Write("");

      }

      /**////

      /// 我們調(diào)用這個屬性來決定http處理程序的實例是否可以用于處理相同其它類型的請求。

      /// HTTP處理程序可以返回true或false來表明它們是否可以重復(fù)使用。

      ///

      public bool IsReusable

      //

      {

      get

      {

      return true;

      }

      }

      #endregion

      }

      }

      然后再web.config里面配置相應(yīng)節(jié)點:這里不懂的參考前邊的,XXX就是我們剛才定義那個后綴名。

      <add verb="*" path="*.xxx"

      type="MyHandler.NewHandler,MyHandler" />

      然后添加一個測試頁面,就可以了。

      HttpHandler之間的關(guān)系是這樣的:

      發(fā)送一個Http請求,然后判斷是否存在自定義的HttpHandler,如果存在的話由自定義的HttpHandler處理Http請求,否則由系統(tǒng)默認(rèn)的HttpHandler處理Http請求。

      在HttpHandler中訪問Session:

      不能直接通過HttpContext訪問。

      必須實現(xiàn)IRequiresSessionState接口。

      IRequiresSessionState接口指定目標(biāo)HTTP處理程序接口具有對會話狀態(tài)值的讀寫訪問權(quán)限。這是一個標(biāo)記接口,沒有任何方法。

      怎樣實現(xiàn)呢,我們還是來看例子吧:添加類庫,引用相應(yīng)的命名空間。

      using System;

      using System.Web;

      using System.Web.SessionState;

      namespace MyHandler

      {

      public class NewHandlerSession : IHttpHandler,IRequiresSessionState

      {

      public NewHandlerSession()

      {

      // TODO: 此處添加構(gòu)造邏輯

      }

      Implementation of IHttpHandler#region Implementation of IHttpHandler

      /**////

      /// http處理程序的核心。我們調(diào)用這個方法來處理http請求。

      ///

      ///

      public void ProcessRequest(System.Web.HttpContext context)

      {

      HttpResponse objResponse = context.Response ;

      HttpRequest objRequest = context.Request;

      HttpSessionState objSession = context.Session;

      objResponse.Write("歡迎使用自定義HttpHandler!

      ");

      objSession["Test"] = "Session 測試!

      ";

      objResponse.Write("Session的值為:"+objSession["Test"].ToString());

      }

      /**////

      /// 我們調(diào)用這個屬性來決定http處理程序的實例是否可以用于處理相同其它類型的請求。

      /// HTTP處理程序可以返回true或false來表明它們是否可以重復(fù)使用。

      ///

      public bool IsReusable

      //

      {

      get

      {

      return true;

      }

      }

      #endregion

      }

      }

      然后配置Web.config的節(jié)點:

      <add verb="*" path="*"

      type="MyHandler.NewHandlerSession,MyHandlerSession" />

      這樣就可以了。

      ASP.NET事件模型機(jī)制:

      ASP.NET之所以對于以前的ASP是一個革命性的巨變,在很大程度上是由于ASP.NET技術(shù)是一種完全基于事件驅(qū)動的全新技術(shù)。

      在ASP.NET中事件的觸發(fā)和處理分別是在客戶端和服務(wù)器段進(jìn)行的。

      ASP.NET中,如果頻繁和服務(wù)器進(jìn)行事件信息的傳遞,會大大降低服務(wù)器的處理效率和性能,因而有些事件如OnMouseOver沒有提供。

      但提供了Change事件。為了提高效率它們被緩存在客戶端。等到再一次事件信息被發(fā)送到服務(wù)器端時一同發(fā)送回去。

    【ASP.NET架構(gòu)及開發(fā)技術(shù)詳解教程】相關(guān)文章:

    ASP.NET MVC異常處理模塊簡單教程-ASP.NET教程實例推薦07-19

    MCSA認(rèn)證教程詳解10-04

    Web開發(fā)的教程圖解06-05

    音頻后期制作教程詳解05-08

    朝鮮族舞蹈基本動作教程詳解09-23

    軟件開發(fā)整體方案詳解09-01

    鑄造安全技術(shù)詳解01-21

    OSI七層與TCP/IP五層網(wǎng)絡(luò)架構(gòu)詳解09-07

    足球頭頂球技術(shù)教程01-19

    拳擊4大拳法技術(shù)詳解06-15

    主站蜘蛛池模板: 国产精品欧美一区二区三区| 国产精品成| 500av导航大全精品| 亚洲国产精品嫩草影院| 在线精品国产一区二区三区| 欧美精品国产日韩综合在线| 精品久久久久久久久久中文字幕 | 亚洲国产精品无码专区在线观看 | 黑人精品videos亚洲人| 久久精品国产亚洲一区二区三区| 在线精品无码字幕无码AV| 2020久久精品国产免费| 偷拍精品视频一区二区三区| 国产精品素人搭讪在线播放| 精品伦精品一区二区三区视频 | 九九热这里只有国产精品| 99热精品在线观看| 人人妻人人澡人人爽精品欧美| 久久久久成人精品无码| 久久91精品国产91久久小草| 日韩精品区一区二区三VR| 久久国产热这里只有精品| 国产91精品一区二区麻豆网站 | 国产精品久久久久…| 香港三级精品三级在线专区 | 好属妞这里只有精品久久| 亚洲欧美精品丝袜一区二区| 99精品视频在线观看免费| 久久久久女人精品毛片| 精品久久久久久国产免费了| 国产精品国产三级国产潘金莲| 91麻豆精品一二三区在线| 国产L精品国产亚洲区久久| 久久se精品一区二区| 国产精品一区二区久久国产| 人妻一区二区三区无码精品一区| 91麻豆精品国产| 精品国产午夜肉伦伦影院| 国产高清一级毛片精品| 国产精品久操视频| 国产精品无码不卡一区二区三区|