中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      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è)計(jì)了不同的解決方案,但是都遵循同一個主題“向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)鏈接庫來實(shí)現(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實(shí)現(xiàn)了ISAPI Filter的功能,是通過對IhttpModule接口的繼承來處理。

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

        HttpModule的實(shí)現(xiàn):

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

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

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

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

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

        下邊我們來看例子,HttpModule的實(shí)現(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("用戶名和密碼為空,驗(yàn)證失敗!") ;

        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é)點(diǎn),這個大家應(yīng)該都能明白。

        然后啟動測試頁面。剛啟動開始后頁面一定顯示“用戶名和密碼為空,驗(yàn)證失敗!”呵呵,別忘記了咱們這就是目的,然后在你的地址欄后邊添加?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的實(shí)現(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控制點(diǎn)->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實(shí)現(xiàn)了ISAPI Extention的功能,他處理請求(Request)的信息和發(fā)送響應(yīng)(Response)。HttpHandler功能的實(shí)現(xiàn)通過實(shí)現(xiàn)IHttpHandler接口來達(dá)到。

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

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

        編寫一個實(shí)現(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處理程序的實(shí)例是否可以用于處理相同其它類型的請求。

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

        ///

        public bool IsReusable

        //

        {

        get

        {

        return true;

        }

        }

        #endregion

        }

        }

        然后再web.config里面配置相應(yīng)節(jié)點(diǎn):這里不懂的參考前邊的,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訪問。

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

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

        怎樣實(shí)現(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處理程序的實(shí)例是否可以用于處理相同其它類型的請求。

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

        ///

        public bool IsReusable

        //

        {

        get

        {

        return true;

        }

        }

        #endregion

        }

        }

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

        <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教程實(shí)例推薦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

      主站蜘蛛池模板: 午夜影片在线观看视频| 黔西县| 亚洲精品中文字幕综合| 石嘴山市| 白丝美女被狂躁免费视频网站| 久久精品国产av大片| 常德市| 无码伊人久久大杳蕉中文无码| 日韩AV无码乱伦丝袜一区| 密云县| 鲁甸县| 亚洲av色在线观看网站| 久久精品a毛片看国产成人| 午夜一区二区三区视频| 亚洲一区二区三区免费av在线| 绿春县| 久久久精品国产精品久久| 精品日韩国产一区二区| 亚洲人成网站www| 北岛玲中文字幕人妻系列| 人妻精品一区二区三区视频| 奈曼旗| 抚顺县| 陵川县| av天堂线上| 云梦县| 梁山县| 封开县| 永州市| 静海县| 国产高潮自拍视频在线观看| 鲜城| 高h视频在线免费观看| 长春市| 中文字幕日本人妻一区| 国产精品综合色区av| 太仆寺旗| 久久久久AV成人无码网站| 亚洲综合1区2区3区| 久久国产色av老熟蜜臀av| 方正县|