天天看點

深入解析ASP.NET架構

深入解析ASP.NET架構
深入解析ASP.NET架構

深入解析ASP.NET架構

深入解析ASP.NET架構

Posted on 2007-08-31 20:21 Yeemio 閱讀(275) 評論(0)  編輯  收藏 所屬分類: 學習WEBCAST筆記

深入解析ASP.NET架構

MSDN的WEBCAST,感覺單純看一遍意義不大,做個筆記,以備不時隻需查找友善。代碼部分本人在XP+VS2005+SQL2005測試通過,請大家指教。

深入解析ASP.NET架構
深入解析ASP.NET架構

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

深入解析ASP.NET架構

具體描述下這樣的:首先客戶請求WEB頁。然後WEB服務尋找指令檔案(.aspx),而這時就是aspnet_isapi.dll這個動态連接配接庫來處理。接着Asp.net代碼被發送到公共語言運作時進行編譯。接着HTML流傳回給浏覽器和令。最後由浏覽器處理HTML并顯示頁面。

深入解析ASP.NET架構
深入解析ASP.NET架構

什麼是ISAPI呢?

深入解析ASP.NET架構

在Internet時代的開端,用戶端的需求非常有限;.htm檔案就可以滿足他們的需求。但是,随着時間的流逝,用戶端需求的擴充超越了.htm檔案或靜态檔案所包含的功能。

深入解析ASP.NET架構

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

深入解析ASP.NET架構

1,ISAPI擴充:ISAPI擴充是使用Win32動态連結庫來實作的。你可以把ISAPI擴充看作是一個普通的應用程式。ISAPI擴充的處理目标是http請求。

深入解析ASP.NET架構

2,ISAPI過濾器:用戶端每次向伺服器送出請求的時候,請求要經過過濾器。用戶端不需要在請求中指定過濾器,隻需要簡單地把請求發送給Web伺服器,接着Web伺服器把請求傳遞給相關的過濾器。接下來過濾器可能修改請求,執行某些登入操作等等。

深入解析ASP.NET架構
深入解析ASP.NET架構

ASP.NET請求的處理過程:

深入解析ASP.NET架構

ASP.NET請求處理過程是基于管道模型的,在模型中ASP.NET把http請求傳遞給管道中的所有子產品。每個子產品都接收http請求并有完全控制權限。子產品可以用任何自認為适合的方式來處理請求。一旦請求經過了所有HTTP子產品,就最終被HTTP處理程式處理。HTTP處理程式對請求進行一些處理,并且結果将再次經過管道中HTTP子產品。

深入解析ASP.NET架構
深入解析ASP.NET架構

ISAPI的篩選器:

深入解析ASP.NET架構

IIS本身是不支援動态頁面的,也就是說它僅僅支援靜态html頁面的内容,對于如.asp,.aspx,.cgi,.php等,IIS并不會處理這些标記,它就會把它當作文本,絲毫不做處理發送到用戶端。為了解決這個問題。IIS有一種機制,叫做ISAPI的篩選器,它是一個标準元件(COM元件)。

深入解析ASP.NET架構

Asp.net服務在注冊到IIS的時候,會把每個擴充可以處理的檔案擴充名注冊到IIS裡面(如:*.ascx、*.aspx等)。擴充啟動後,就根據定義好的方式來處理IIS所不能處理的檔案,然後把控制權跳轉到專門處理代碼的程序中讓這個程序開始處理代碼,生成标準的HTML代碼,生成後把這些代碼加入到原有的Html中,最後把完整的Html傳回給IIS,IIS再把内容發送到用戶端。

深入解析ASP.NET架構
深入解析ASP.NET架構

HttpModule:

深入解析ASP.NET架構

HttpModule實作了ISAPI Filter的功能,是通過對IhttpModule接口的繼承來處理。

深入解析ASP.NET架構

HTTP子產品是實作了System.Web.IhttpModule接口的.NET元件。這些元件通過在某些事件中注冊自身,把自己插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對請求有興趣的HTTP子產品,這樣該子產品就能處理請求了。

深入解析ASP.NET架構
深入解析ASP.NET架構

HttpModule的實作:

深入解析ASP.NET架構

1. 編寫一個類,實作IhttpModule接口。

深入解析ASP.NET架構

2. 實作Init 方法,并且注冊需要的方法。

深入解析ASP.NET架構

3. 實作注冊的方法。

深入解析ASP.NET架構

4. 實作Dispose方法,如果需要手工為類做一些清除工作,可以添加Dispose方法的實作,但這不是必需的,通常可以不為Dispose方法添加任何代碼。

深入解析ASP.NET架構

5. 在Web.config檔案中,注冊您編寫的類。

深入解析ASP.NET架構
深入解析ASP.NET架構

下邊我們來看例子,HttpModule的實作:

深入解析ASP.NET架構

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

深入解析ASP.NET架構

using System;

深入解析ASP.NET架構

using System.Collections.Generic;

深入解析ASP.NET架構

using System.Text;

深入解析ASP.NET架構

using System.Web;

深入解析ASP.NET架構

using System.Security.Principal;

深入解析ASP.NET架構
深入解析ASP.NET架構

namespace Httplibrary

深入解析ASP.NET架構

{

深入解析ASP.NET架構

    public class SecurityModules:IHttpModule

深入解析ASP.NET架構

    {

深入解析ASP.NET架構

        public void Init(HttpApplication r_objApplication)

深入解析ASP.NET架構

  {

深入解析ASP.NET架構

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

深入解析ASP.NET架構

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

深入解析ASP.NET架構

  }

深入解析ASP.NET架構
深入解析ASP.NET架構

  public void Dispose()

深入解析ASP.NET架構

  {

深入解析ASP.NET架構

   

深入解析ASP.NET架構

  }

深入解析ASP.NET架構
深入解析ASP.NET架構

  private void AuthenticateRequest(object r_objSender,EventArgs r_objEventArgs)

深入解析ASP.NET架構

  {

深入解析ASP.NET架構

      // 鑒别使用者的憑證,并找出使用者角色。

深入解析ASP.NET架構

      HttpApplication objApp = (HttpApplication) r_objSender ;

深入解析ASP.NET架構

      HttpContext objContext = (HttpContext) objApp.Context ;

深入解析ASP.NET架構

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

深入解析ASP.NET架構

      {

深入解析ASP.NET架構

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

深入解析ASP.NET架構

          objContext.Response.End() ;

深入解析ASP.NET架構

      }

深入解析ASP.NET架構

      string userid = "" ;

深入解析ASP.NET架構

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

深入解析ASP.NET架構

      string password = "" ;

深入解析ASP.NET架構

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

深入解析ASP.NET架構

      string[] strRoles ;

深入解析ASP.NET架構

      strRoles = AuthenticateAndGetRoles(userid, password) ;

深入解析ASP.NET架構

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

深入解析ASP.NET架構

      {

深入解析ASP.NET架構

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

深入解析ASP.NET架構

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

深入解析ASP.NET架構
深入解析ASP.NET架構

      }

深入解析ASP.NET架構

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

深入解析ASP.NET架構

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

深入解析ASP.NET架構

  }

深入解析ASP.NET架構

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

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            string[] strRoles = null ;

深入解析ASP.NET架構

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

深入解析ASP.NET架構

            {

深入解析ASP.NET架構

                strRoles = new String[1] ;

深入解析ASP.NET架構

                strRoles[0] = "Administrator" ;

深入解析ASP.NET架構

            }

深入解析ASP.NET架構

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

深入解析ASP.NET架構

            {

深入解析ASP.NET架構

                strRoles = new string[1] ;

深入解析ASP.NET架構

                strRoles[0] = "User" ; 

深入解析ASP.NET架構

            }

深入解析ASP.NET架構

            return strRoles ;

深入解析ASP.NET架構

  }

深入解析ASP.NET架構

    }

深入解析ASP.NET架構
深入解析ASP.NET架構

    }

深入解析ASP.NET架構
深入解析ASP.NET架構
深入解析ASP.NET架構

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

深入解析ASP.NET架構

< httpModules >

深入解析ASP.NET架構

       <!-- 注意我這裡的Httplibrary是你添加引用的那個DLL的檔案名.Httplibrary.SecurityModules

深入解析ASP.NET架構

      中前邊部分是你那個類的名稱空間,後邊的是你建的類的名字。 -->

深入解析ASP.NET架構

       < add  name =" Test1 "  type ="Httplibrary.SecurityModules,Httplibrary" />

深入解析ASP.NET架構

</ httpModules >

深入解析ASP.NET架構
深入解析ASP.NET架構

然後添加  這個節點,這個大家應該都能明白。

深入解析ASP.NET架構

< authorization >

深入解析ASP.NET架構

       < deny  users ="?" />

深入解析ASP.NET架構

  </ authorization >

深入解析ASP.NET架構

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

深入解析ASP.NET架構

WebConfig設定

深入解析ASP.NET架構

< httpModules >

深入解析ASP.NET架構

< add  type =“classname,assemblyname”

深入解析ASP.NET架構

name =“modulename” />

深入解析ASP.NET架構

< remove  name =“modulename” />

深入解析ASP.NET架構

< clear />

深入解析ASP.NET架構

</ httpModules >

深入解析ASP.NET架構

子标記說明:

深入解析ASP.NET架構

< add > 将HttpModule 類添加到應用程式。請注意,如果以前已指定了相同的謂詞/路徑組合(例如在父目錄的Web.config 檔案中),則對的第二個調用将重寫以前的設定。

深入解析ASP.NET架構

< remove > 從應用程式移除HttpModule 類。

深入解析ASP.NET架構

< clear > 從應用程式移除所有HttpModule 映射。

深入解析ASP.NET架構
深入解析ASP.NET架構

深入研究HttpModule

深入解析ASP.NET架構

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

深入解析ASP.NET架構

BeginRequest

深入解析ASP.NET架構

AuthenticateRequest

深入解析ASP.NET架構

AuthorizeRequest

深入解析ASP.NET架構

ResolveRequestCache

深入解析ASP.NET架構

AcquireRequestState

深入解析ASP.NET架構

PreRequestHandlerExecute

深入解析ASP.NET架構

PostRequestHandlerExecute

深入解析ASP.NET架構

ReleaseRequestState

深入解析ASP.NET架構

UpdateRequestCache

深入解析ASP.NET架構

EndRequest

深入解析ASP.NET架構

我們都可以對以上事件進行重新定義,注意時重新定義不時覆寫。我們看一個例子,多個HttpModule的實作,建立兩個類庫,什麼都相同就是類名不相同,引入相應的命名空間後我們編寫這個類,代碼如下:

深入解析ASP.NET架構

using System;

深入解析ASP.NET架構

using System.Collections.Generic;

深入解析ASP.NET架構

using System.Text;

深入解析ASP.NET架構

using System.Web;

深入解析ASP.NET架構
深入解析ASP.NET架構

namespace HttpModuleTest1

深入解析ASP.NET架構

{

深入解析ASP.NET架構

    public class Test1Module:IHttpModule

深入解析ASP.NET架構

    {

深入解析ASP.NET架構

        public Test1Module()

深入解析ASP.NET架構

        {

深入解析ASP.NET架構
深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        public string ModuleName

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            get

深入解析ASP.NET架構

            {

深入解析ASP.NET架構

                return "Test1Module";

深入解析ASP.NET架構

            }

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        public void Init(HttpApplication application)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            application.BeginRequest += new EventHandler(myBeginRequest);

深入解析ASP.NET架構

            application.EndRequest += new EventHandler(myEndRequest);

深入解析ASP.NET架構

            application.PreRequestHandlerExecute += new EventHandler(myPreRequestHandlerExecute);

深入解析ASP.NET架構

            application.PostRequestHandlerExecute += new EventHandler(myPostRequestHandlerExecute);

深入解析ASP.NET架構

            application.ReleaseRequestState += new EventHandler(myReleaseRequestState);

深入解析ASP.NET架構

            application.AcquireRequestState += new EventHandler(myAcquireRequestState);

深入解析ASP.NET架構

            application.AuthenticateRequest += new EventHandler(myAuthenticateRequest);

深入解析ASP.NET架構

            application.AuthorizeRequest += new EventHandler(myAuthorizeRequest);

深入解析ASP.NET架構

            application.ResolveRequestCache += new EventHandler(myResolveRequestCache);

深入解析ASP.NET架構

            application.PreSendRequestHeaders += new EventHandler(myPreSendRequestHeaders);

深入解析ASP.NET架構

            application.PreSendRequestContent += new EventHandler(myPreSendRequestContent);

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myBeginRequest(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Beggining of Request < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myEndRequest(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:End of Request < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myPreRequestHandlerExecute(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_RequestHandlerExecute: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myPostRequestHandlerExecute(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_PostRequestHandlerExecute: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myReleaseRequestState(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_ReleaseRequestState: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myAcquireRequestState(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_ReleaseRequestState: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myAuthenticateRequest(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_AuthenticateRequest: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構
深入解析ASP.NET架構

        private void myAuthorizeRequest(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_AuthorizeRequest: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myResolveRequestCache(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_ResolveRequestCache: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myPreSendRequestHeaders(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_PreSendRequestHeaders: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        private void myPreSendRequestContent(object source, EventArgs e)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpApplication application = (HttpApplication)source;

深入解析ASP.NET架構

            HttpContext context = application.Context;

深入解析ASP.NET架構

            context.Response.Write("Test1Module:Application_PreSendRequestContent: < br > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        public void Dispose()

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

    }

深入解析ASP.NET架構

}

深入解析ASP.NET架構
深入解析ASP.NET架構
深入解析ASP.NET架構

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

深入解析ASP.NET架構
深入解析ASP.NET架構

     < httpModules >

深入解析ASP.NET架構

       <!-- 注意我這裡的Httplibrary是你添加引用的那個DLL的檔案名.Httplibrary.SecurityModules

深入解析ASP.NET架構

      中前邊部分是你那個類的名稱空間,後邊的是你建的類的名字。 -->

深入解析ASP.NET架構

       < add  name =" Test1 "  type ="Httplibrary.SecurityModules,Httplibrary" />

深入解析ASP.NET架構

      < add  name =" MultiTest1 "  type ="HttpModuleTest1.Test1Module, HttpModuleTest1"   />

深入解析ASP.NET架構

        < add  name =" MultiTest2"  type ="HttpModuleTest2.Test2Module, HttpModuleTest2"   />

深入解析ASP.NET架構

     </ httpModules >

深入解析ASP.NET架構
深入解析ASP.NET架構

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

深入解析ASP.NET架構
深入解析ASP.NET架構

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

深入解析ASP.NET架構

HttpRequest開始->進入HttpModule->HttpModule->

深入解析ASP.NET架構

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

深入解析ASP.NET架構

HttpModule.AuthorizeRequest->HttpModule.ResolveRequestCache->

深入解析ASP.NET架構

初始化HttpHandler->建立HttpHandler控制點->HttpModule繼續處理。HttpHandler已經建立,此後Session可用->HttpModule.AcquireRequestState

深入解析ASP.NET架構

->HttpModule.PreRequestHandlerExecute->進入HttpHandler處理HttpRequest

深入解析ASP.NET架構

->HttpHandler->HttpHandler.ProcessRequest->傳回HttpModule, HttpHandler結束,Session失效->HttpModule.PostRequestHandlerExecute-> HttpModule.ReleaseRequestState->

深入解析ASP.NET架構

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

深入解析ASP.NET架構

将處理的資料傳回用戶端,處理結束。

深入解析ASP.NET架構
深入解析ASP.NET架構
深入解析ASP.NET架構

HttpHandler:

深入解析ASP.NET架構

HttpHandler實作了ISAPI Extention的功能,他處理請求(Request)的資訊和發送響應(Response)。HttpHandler功能的實作通過實作IHttpHandler接口來達到。

深入解析ASP.NET架構

HTTP處理程式是實作了System.Web.IHttpHandler接口的.NET元件。任何實作了IHttpHandler接口的類都可以用于處理輸入的HTTP請求。HTTP處理程式與ISAPI擴充有些類似。HTTP處理程式和ISAPI擴充的差别在于在URL中可以使用HTTP處理程式的檔案名稱直接調用它們,與ISAPI擴充類似。

深入解析ASP.NET架構
深入解析ASP.NET架構

HttpHandler的實作,實作我們的HTTP處理程式包含以下步驟:

深入解析ASP.NET架構

編寫一個實作IHttpHandler接口的類。

深入解析ASP.NET架構

在web.config或machine.config檔案中注冊這個處理程式。

深入解析ASP.NET架構

在Internet服務管理器中把檔案擴充(你想要處理的檔案擴充名)映射到ASP.NETISAPI擴充DLL(aspnet_isapi.dll)上。

深入解析ASP.NET架構
深入解析ASP.NET架構
深入解析ASP.NET架構

我們來看一個例子,打開IIS伺服器,屬性,主目錄下有個配置,裡面你就可以找到你的程式所執行檔案所要調用的.dll檔案。我們可以看到.aspx就是 C:WINDOWSMicrosoft.NETFramework2.0.50727aspnet_isapi.dll這個檔案

深入解析ASP.NET架構

來執行的。這裡還可以添加你自己任意定義任意擴充名檔案,定義了後你的伺服器就可以認識這些人間,注意隻是你的伺服器,别人的不認識。這時候大家就會對網絡上流行的各式各樣的字尾名不奇怪了吧,可以自己定義的。

深入解析ASP.NET架構

我們自己定義一個帶.xxx字尾的。

深入解析ASP.NET架構

添加一個類庫,引用的相應的命名空間,

深入解析ASP.NET架構

using System;

深入解析ASP.NET架構

using System.Collections.Generic;

深入解析ASP.NET架構

using System.Text;

深入解析ASP.NET架構

using System.Web;

深入解析ASP.NET架構

namespace MyHandler

深入解析ASP.NET架構

{

深入解析ASP.NET架構

    public class NewHandler:IHttpHandler

深入解析ASP.NET架構

    {

深入解析ASP.NET架構

        public NewHandler()

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            // TODO: 此處添加構造邏輯

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        Implementation of IHttpHandler#region Implementation of IHttpHandler

深入解析ASP.NET架構

        /**  < summary >

深入解析ASP.NET架構

        /// http處理程式的核心。我們調用這個方法來處理http請求。

深入解析ASP.NET架構

        ///  </ summary >

深入解析ASP.NET架構

        ///  < param  name ="context" ></ param >

深入解析ASP.NET架構

        public void ProcessRequest(System.Web.HttpContext context)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpResponse objResponse = context.Response;

深入解析ASP.NET架構
深入解析ASP.NET架構

            objResponse.Write(" < html >< body >< h1 > Hello xxx ! ");

深入解析ASP.NET架構

            objResponse.Write(" </ body ></ html > ");

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        /**  < summary >

深入解析ASP.NET架構

        /// 我們調用這個屬性來決定http處理程式的執行個體是否可以用于處理相同其它類型的請求。

深入解析ASP.NET架構

        /// HTTP處理程式可以傳回true或false來表明它們是否可以重複使用。

深入解析ASP.NET架構

        ///  </ summary >

深入解析ASP.NET架構

        public bool IsReusable

深入解析ASP.NET架構

        //

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            get

深入解析ASP.NET架構

            {

深入解析ASP.NET架構

                return true;

深入解析ASP.NET架構

            }

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        #endregion

深入解析ASP.NET架構

    }

深入解析ASP.NET架構

}

深入解析ASP.NET架構
深入解析ASP.NET架構

然後再web.config裡面配置相應節點:這裡不懂的參考前邊的,XXX就是我們剛才定義那個字尾名。

深入解析ASP.NET架構

< httpHandlers >

深入解析ASP.NET架構

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

深入解析ASP.NET架構

               type ="MyHandler.NewHandler,MyHandler"   />

深入解析ASP.NET架構

       </ httpHandlers >

深入解析ASP.NET架構

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

深入解析ASP.NET架構
深入解析ASP.NET架構

HttpHandler之間的關系是這樣的:

深入解析ASP.NET架構

發送一個Http請求,然後判斷是否存在自定義的HttpHandler,如果存在的話由自定義的HttpHandler處理Http請求,否則由系統預設的HttpHandler處理Http請求。

深入解析ASP.NET架構
深入解析ASP.NET架構

在HttpHandler中通路Session:

深入解析ASP.NET架構

不能直接通過HttpContext通路。

深入解析ASP.NET架構

必須實作IRequiresSessionState接口。

深入解析ASP.NET架構

IRequiresSessionState接口指定目标HTTP處理程式接口具有對會話狀态值的讀寫通路權限。這是一個标記接口,沒有任何方法。

深入解析ASP.NET架構
深入解析ASP.NET架構

怎樣實作呢,我們還是來看例子吧:添加類庫,引用相應的命名空間。

深入解析ASP.NET架構
深入解析ASP.NET架構
深入解析ASP.NET架構

using System;

深入解析ASP.NET架構

using System.Web;

深入解析ASP.NET架構

using System.Web.SessionState;

深入解析ASP.NET架構

namespace MyHandler

深入解析ASP.NET架構

{

深入解析ASP.NET架構

    public class NewHandlerSession : IHttpHandler,IRequiresSessionState

深入解析ASP.NET架構

    {

深入解析ASP.NET架構

        public NewHandlerSession()

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            // TODO: 此處添加構造邏輯

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        Implementation of IHttpHandler#region Implementation of IHttpHandler

深入解析ASP.NET架構

        /**  < summary >

深入解析ASP.NET架構

        /// http處理程式的核心。我們調用這個方法來處理http請求。

深入解析ASP.NET架構

        ///  </ summary >

深入解析ASP.NET架構

        ///  < param  name ="context" ></ param >

深入解析ASP.NET架構

        public void ProcessRequest(System.Web.HttpContext context)

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            HttpResponse objResponse = context.Response ;

深入解析ASP.NET架構

            HttpRequest  objRequest = context.Request;

深入解析ASP.NET架構

            HttpSessionState  objSession = context.Session;

深入解析ASP.NET架構

            objResponse.Write("歡迎使用自定義HttpHandler! < br > ");

深入解析ASP.NET架構

            objSession["Test"] = "Session 測試! < br > ";

深入解析ASP.NET架構

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

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        /**  < summary >

深入解析ASP.NET架構

        /// 我們調用這個屬性來決定http處理程式的執行個體是否可以用于處理相同其它類型的請求。

深入解析ASP.NET架構

        /// HTTP處理程式可以傳回true或false來表明它們是否可以重複使用。

深入解析ASP.NET架構

        ///  </ summary >

深入解析ASP.NET架構

        public bool IsReusable

深入解析ASP.NET架構

            //

深入解析ASP.NET架構

        {

深入解析ASP.NET架構

            get

深入解析ASP.NET架構

            {

深入解析ASP.NET架構

                return true;

深入解析ASP.NET架構

            }

深入解析ASP.NET架構

        }

深入解析ASP.NET架構

        #endregion

深入解析ASP.NET架構

    }

深入解析ASP.NET架構
深入解析ASP.NET架構

}

深入解析ASP.NET架構
深入解析ASP.NET架構

然後配置Web.config的節點:

深入解析ASP.NET架構

  < httpHandlers >

深入解析ASP.NET架構

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

深入解析ASP.NET架構

               type="MyHandler.NewHandler,MyHandler" /> -->

深入解析ASP.NET架構

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

深入解析ASP.NET架構

               type ="MyHandler.NewHandlerSession,MyHandlerSession"   />

深入解析ASP.NET架構

       </ httpHandlers >

深入解析ASP.NET架構

這樣就可以了。

深入解析ASP.NET架構
深入解析ASP.NET架構

ASP.NET事件模型機制:

深入解析ASP.NET架構

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

深入解析ASP.NET架構

在ASP.NET中事件的觸發和處理分别是在用戶端和伺服器段進行的。

深入解析ASP.NET架構

ASP.NET中,如果頻繁和伺服器進行事件資訊的傳遞,會大大降低伺服器的處理效率和性能,因而有些事件如OnMouseOver沒有提供。

深入解析ASP.NET架構

但提供了Change事件。為了提高效率它們被緩存在用戶端。等到再一次事件資訊被發送到伺服器端時一同發送回去。  

繼續閱讀