佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Asp.net的應(yīng)用程序?qū)ο蠛晚撁嫔嬷芷?/div>

Asp.net的應(yīng)用程序?qū)ο蠛晚撁嫔嬷芷?/h1>

熱門標(biāo)簽:Linux服務(wù)器 Mysql連接數(shù)設(shè)置 銀行業(yè)務(wù) 服務(wù)器配置 電子圍欄 團購網(wǎng)站 阿里云 科大訊飛語音識別系統(tǒng)

IIS在接到一個新的http請求后,最終會調(diào)用asp.net_isapi.dll的 ISAPI擴展(特指IIS6.0環(huán)境,iis7.0的應(yīng)用程序池默認為集成方式,相對有所變化),然后傳遞到httpRuntime Pipe(http運行時管道),Asp.Net這時才開始運行(即HttpRunTime是Asp.Net真正的入口),HttpRunTime會為每 個asp.net應(yīng)用自動創(chuàng)建一個HttpApplication的實例,而該實例中又包含以下屬性:

注1

Application -->相當(dāng)于傳統(tǒng)意義上asp時代的application對象,通常用于定義一個asp.net應(yīng)用的全局變量

Context -->HttpContext(上下文)類的實例【Asp.Net新增的】

Modules -->影響當(dāng)前應(yīng)用程序的HttpModule模塊集合

Request -->類似于asp中的Request對象,通常用于接收一些特定的值(比如Request.Form或Request.QueryString)

Response -->類似于asp中的Response對象,通常用于向做頁面輸出指定內(nèi)容(比如Resonse.Write)

Server -->類似于asp中的Server對象,通過它能獲得一些服務(wù)端的信息(比如Server.MapPath)

Session -->類似于asp中的Session對象

User -->用于獲取用戶認證相關(guān)的安全信息


從上面的屬性可以發(fā)現(xiàn):很多其實在asp年代已在使用,只有Context,Modules,User這三個是Asp.Net新增的


HttpApplication類除了具備"注1"的幾個屬性外,還有自己的方法,這里特別提一下Init方法和Dispose方法,這二個方法均可重載.

它們的調(diào)用時機為:

Init方法在Application_Start之后調(diào)用,而Dispose在Application_End之前調(diào)用,另外 Application_Start在整個asp.net應(yīng)用的生命周期內(nèi)只激發(fā)一次(比如IIS啟動或網(wǎng)站啟動時),類似的 Application_End也只有當(dāng)asp.net應(yīng)用程序關(guān)閉時被調(diào)用(比如IIS停止或網(wǎng)站停止時)

除了Application_Start和Application_End方法,HttpApplication還提供了以下事件:

這些事件包括前面提到的可重載的Init及Dispose方法,再加上Session對應(yīng)的Session_Start與Session_End方法,均可直接在Global.ascx.cs中以Application_XXX的形式使用(因為Global.ascx.cs中定義的類Global本身就是繼承自HttpApplication的)

復(fù)制代碼 代碼如下:

public class Global : System.Web.HttpApplication

再來看一下相對asp而言,新增的Context,Modules,User這三個屬性

Context:

Context即HttpContext類的實例,在幾乎整個aspx頁面生命周期中,Context上下文一直伴隨著各個環(huán)節(jié)向下傳遞

所以我們幾乎可以在web應(yīng)用中的任何環(huán)節(jié),用HttpContext.Current來引用到當(dāng)前的上下文實例,從HttpContext的定義上,還可以發(fā)現(xiàn)Context本身的屬性中,又可以得到 Application,ApplicationInstance,Profile,Response.Request...等對象的實例引用

回想一下:

復(fù)制代碼 代碼如下:

public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


我們在使用一個ashx文件時,ProcessRequest方法便是把當(dāng)前上下文傳遞進來,進而通過context得到Response對象的引用,最終可以向頁面輸出任何想要的內(nèi)容.

Modules:

每一個實現(xiàn)了IHttpModule接口的類,就可以被認為是Http模塊組件,可以理解為http請求攔截器,攔截到http請求后,它能修改正在被處理的Context上下文,完事兒之后,再把控制權(quán)交還給管道,如果還有其它模塊,則依次繼續(xù)處理,直到所有Modules集合中的 HttpModule都“爽”完為止(注:可憐的http請求就這樣給各個httpModule輪X了)

asp.net2.0默認內(nèi)置了很多HttpModule,從Machine.Config文件中可以發(fā)現(xiàn)以下默認的內(nèi)置模塊:

注2
AnonymouseIdentification --為匿名用戶分配一個臨時身份
FileAuthorization --驗證用戶是否有請求文件的Windows NT許可
FormsAuthentication --窗體身份驗證模塊(如果沒有這個模塊,asp.net就無法以用戶名/密碼[即FOrms]方式驗證)
OutputCache --輸出緩存模塊
PassportAuthentication --PassPort驗證模塊
Profile --用戶配置模塊(如果沒有它,asp.net中就無法使用Profile)
RoleManager --角色管理
SessionSate --會話狀態(tài)模塊
UrlAuthorization --基于URL的身份驗證模塊
WindowsAuthentication --Windows和IIS身份驗證模塊

User:

如果您使用過asp.net2.0內(nèi)置的Membership/Role機制來進行訪問認證,就會對User對象感到很熟悉,比如:

復(fù)制代碼 代碼如下:

if (HttpContext.Current.User.Identity.IsAuthenticated)
{
     //用戶登錄過了...
}


我們常用它來判斷當(dāng)前瀏覽用戶的登錄狀態(tài),關(guān)于User類的更詳細定義,可參見MSDN


生命周期:

最后再來回顧一下Asp.Net中Page頁的生命周期,Page中定義了幾個事件:

總體上講:一個ASPX頁面被請求時,最終的生命周期就是由Page中定義的上述事件(還有一些可重載的回調(diào)方法)以及以前提到的HttpApplication類中定義的事件(以相應(yīng)的回調(diào)方法)共同觸發(fā)或調(diào)用,最終疊加形成的一連串處理過程。

如果先不考慮HttpApplication中的事件處理方法(即不考慮我們在Global.ascx.cs中定義的Application_XXX處理方法),Page中的事件(方法)常規(guī)觸發(fā)(調(diào)用)順序為:

01.Page_PreInit

02.Page_Init

03.Page_InitComplete

04.Page_PreLoad

05.Page_Load

06.Page_LoadComplete

07.Page_PreRender

08.Page_SaveStateComplete

09.Page_Unload

這是在Page頁面未回發(fā),且不考慮頁面子控件的前提下正常的順序,如果加入頁面回發(fā)(比如在頁面中放一個asp:Button,然后在Button的Click回發(fā)事件中加入處理函數(shù))后,順序稍微有些變化:

01.Page_PreInit

02.Page_Init

03.Page_InitComplete

04.Page_PreLoad

05.Page_Load

06.Button1_Click

07.Page_LoadComplete

08.Page_PreRender

09.Page_SaveStateComplete

10.Page_Unload

不同的地方在于:回發(fā)事件Button1_Click在Page_Load后被觸發(fā).

最后再把HttpApplication的事件考慮進來,看下疊加后的順序,不過先別著急,我們先來看一種特殊情況,如果一個asp.net應(yīng)用根目錄下未設(shè)置默認頁,這時直接瀏覽根目錄,比如http://localhost:2345/ 時,Globl.ascx.cs中定義的Application_XXX方法的調(diào)用順序如下:
2010-03-28 15:01:39 413 Application_Start

2010-03-28 15:01:39 491 Init

2010-03-28 15:01:39 491 Application_BeginRequest

2010-03-28 15:01:39 506 Application_AuthenticateRequest

2010-03-28 15:01:39 506 Application_PostAuthenticateRequest

2010-03-28 15:01:39 506 Application_AuthorizeRequest

2010-03-28 15:01:39 522 Application_PostAuthorizeRequest

2010-03-28 15:01:39 522 Application_ResolveRequestCache

2010-03-28 15:01:39 522 Application_PostResolveRequestCache

2010-03-28 15:01:39 522 Application_PostMapRequestHandler

2010-03-28 15:01:39 522 Application_AcquireRequestState

2010-03-28 15:01:39 537 Application_PostAcquireRequestState

2010-03-28 15:01:39 537 Application_PreRequestHandlerExecute

2010-03-28 15:01:39 553 Application_Error

2010-03-28 15:01:39 553 Application_EndRequest

2010-03-28 15:01:39 569 Application_PreSendRequestHeaders

2010-03-28 15:01:39 569 Application_PreSendRequestContent

可以看到會觸發(fā)Application_Error事件,即HttpRuntime認為這是一個錯誤.

緊接著再瀏覽一個實際存在的頁面,如果這時應(yīng)用程序有嚴重錯誤,導(dǎo)致Application關(guān)閉(比如web.config配置錯誤),調(diào)用的順序如下:
2010-03-28 15:03:47 704 Application_BeginRequest

2010-03-28 15:03:47 704 Application_AuthenticateRequest

2010-03-28 15:03:47 766 Application_PostAuthenticateRequest

2010-03-28 15:03:47 766 Application_AuthorizeRequest

2010-03-28 15:03:47 766 Application_PostAuthorizeRequest

2010-03-28 15:03:47 766 Application_ResolveRequestCache

2010-03-28 15:03:47 783 Application_PostResolveRequestCache

2010-03-28 15:03:48 667 Application_PostMapRequestHandler

2010-03-28 15:03:48 667 Application_AcquireRequestState

2010-03-28 15:03:48 683 Application_PostAcquireRequestState

2010-03-28 15:03:48 698 Application_PreRequestHandlerExecute

2010-03-28 15:03:48 745 Page_PreInit

2010-03-28 15:04:02 903 Page_Unload

2010-03-28 15:04:02 903 Application_Error

2010-03-28 15:04:02 918 Application_EndRequest

2010-03-28 15:04:02 996 Application_PreSendRequestHeaders

2010-03-28 15:04:02 996 Application_PreSendRequestContent

2010-03-28 15:04:03 371 Application_Disposed

2010-03-28 15:04:03 371 Dispose

2010-03-28 15:04:03 386 Application_End

對比剛才的順序,會發(fā)現(xiàn)Application_Start及Init沒有再次被調(diào)用,也印證了文章前面提到的一些結(jié)論 (Application_Start在整個asp.net應(yīng)用生命周期內(nèi)只觸發(fā)一次),而且從最后的三個輸出能知道:應(yīng)用程序關(guān)閉時 Application_Disposed,Dispose,Application_End按順序調(diào)用.

再"重新"瀏覽(指web Server重啟)一下正常訪問的頁面,在不出錯也不回發(fā)的情況下,順序如下:
2010-03-28 15:08:11 513 Application_Start

2010-03-28 15:08:11 591 Init

2010-03-28 15:08:11 591 Application_BeginRequest

2010-03-28 15:08:11 591 Application_AuthenticateRequest

2010-03-28 15:08:11 591 Application_PostAuthenticateRequest

2010-03-28 15:08:11 606 Application_AuthorizeRequest

2010-03-28 15:08:11 606 Application_PostAuthorizeRequest

2010-03-28 15:08:11 606 Application_ResolveRequestCache

2010-03-28 15:08:11 606 Application_PostResolveRequestCache

2010-03-28 15:08:11 622 Application_PostMapRequestHandler

2010-03-28 15:08:11 637 Application_EndRequest

2010-03-28 15:08:11 637 Application_PreSendRequestHeaders

2010-03-28 15:08:11 637 Application_PreSendRequestContent

2010-03-28 15:08:11 637 Application_BeginRequest

2010-03-28 15:08:11 637 Application_AuthenticateRequest

2010-03-28 15:08:11 653 Application_PostAuthenticateRequest

2010-03-28 15:08:11 653 Application_AuthorizeRequest

2010-03-28 15:08:11 653 Application_PostAuthorizeRequest

2010-03-28 15:08:11 653 Application_ResolveRequestCache

2010-03-28 15:08:11 653 Application_PostResolveRequestCache

2010-03-28 15:08:11 653 Application_PostMapRequestHandler

2010-03-28 15:08:11 653 Session_Start

2010-03-28 15:08:11 653 Application_AcquireRequestState

2010-03-28 15:08:11 653 Application_PostAcquireRequestState

2010-03-28 15:08:11 653 Application_PreRequestHandlerExecute

2010-03-28 15:08:11 669 Page_PreInit

2010-03-28 15:08:11 684 Page_Init

2010-03-28 15:08:11 684 Page_InitComplete

2010-03-28 15:08:11 684 Page_PreLoad

2010-03-28 15:08:11 684 Page_Load

2010-03-28 15:08:11 684 Page_LoadComplete

2010-03-28 15:08:11 684 Page_PreRender

2010-03-28 15:08:11 684 Page_SaveStateComplete

2010-03-28 15:08:11 700 Page_Unload

2010-03-28 15:08:11 700 Application_PostRequestHandlerExecute

2010-03-28 15:08:11 700 Application_ReleaseRequestState

2010-03-28 15:08:11 700 Application_PostReleaseRequestState

2010-03-28 15:08:11 700 Application_UpdateRequestCache

2010-03-28 15:08:11 700 Application_PostUpdateRequestCache

2010-03-28 15:08:11 700 Application_EndRequest

2010-03-28 15:08:11 700 Application_PreSendRequestHeaders

2010-03-28 15:08:11 700 Application_PreSendRequestContent

2010-03-28 15:08:11 793 Application_BeginRequest

2010-03-28 15:08:11 793 Application_AuthenticateRequest

2010-03-28 15:08:11 793 Application_PostAuthenticateRequest

2010-03-28 15:08:11 793 Application_AuthorizeRequest

2010-03-28 15:08:11 793 Application_PostAuthorizeRequest

2010-03-28 15:08:11 793 Application_ResolveRequestCache

2010-03-28 15:08:11 793 Application_PostResolveRequestCache

2010-03-28 15:08:11 809 Application_PostMapRequestHandler

2010-03-28 15:08:11 809 Application_AcquireRequestState

2010-03-28 15:08:11 809 Application_PostAcquireRequestState

2010-03-28 15:08:11 809 Application_PreRequestHandlerExecute

2010-03-28 15:08:11 825 Application_PostRequestHandlerExecute

2010-03-28 15:08:11 825 Application_ReleaseRequestState

2010-03-28 15:08:11 840 Application_PostReleaseRequestState

2010-03-28 15:08:11 949 Application_UpdateRequestCache

2010-03-28 15:08:11 949 Application_PostUpdateRequestCache

2010-03-28 15:08:11 965 Application_EndRequest

2010-03-28 15:08:11 981 Application_PreSendRequestHeaders

2010-03-28 15:08:11 981 Application_PreSendRequestContent

哇!原來一個頁面訪問下來,會調(diào)用到這么多的方法,怪不得很多高并發(fā)的大型網(wǎng)站,通常都要自己寫一個精減的HttpHandler用來取代Page做為基類,以期望獲得更好的性能

最后:我們在做網(wǎng)站開發(fā)時,不可能只用到Page頁,很多時候還會用到UserControl(用戶自定義控件),先看下它的繼承關(guān)系,比如我們創(chuàng)建了一個TestUserControl的用戶控件

TestUserControl --> UserControl ---> TemplateControl --> Control

最終在Control類的定義下,可以看到

這似乎表明用戶控件中,應(yīng)該有Page_Init,Page_Load,Page_Unload...等事件,通常我們只用到Init,Load事件,如果加入一個用戶控件后,整個生命周期就更復(fù)雜了:

2010-06-12 15:35:28 042 Application_Start

2010-06-12 15:35:28 072 Init

2010-06-12 15:35:28 072 Application_BeginRequest

2010-06-12 15:35:28 082 Application_AuthenticateRequest

2010-06-12 15:35:28 082 Application_PostAuthenticateRequest

2010-06-12 15:35:28 092 Application_AuthorizeRequest

2010-06-12 15:35:28 102 Application_PostAuthorizeRequest

2010-06-12 15:35:28 102 Application_ResolveRequestCache

2010-06-12 15:35:28 112 Application_PostResolveRequestCache

2010-06-12 15:35:28 122 Application_PostMapRequestHandler

2010-06-12 15:35:28 142 Application_EndRequest

2010-06-12 15:35:28 142 Application_PreSendRequestHeaders

2010-06-12 15:35:28 142 Application_PreSendRequestContent

2010-06-12 15:35:28 152 Application_BeginRequest

2010-06-12 15:35:28 152 Application_AuthenticateRequest

2010-06-12 15:35:28 162 Application_PostAuthenticateRequest

2010-06-12 15:35:28 162 Application_AuthorizeRequest

2010-06-12 15:35:28 162 Application_PostAuthorizeRequest

2010-06-12 15:35:28 172 Application_ResolveRequestCache

2010-06-12 15:35:28 172 Application_PostResolveRequestCache

2010-06-12 15:35:28 172 Application_PostMapRequestHandler

2010-06-12 15:35:28 172 Session_Start

2010-06-12 15:35:28 172 Application_AcquireRequestState

2010-06-12 15:35:28 182 Application_PostAcquireRequestState

2010-06-12 15:35:28 182 Application_PreRequestHandlerExecute

2010-06-12 15:35:28 192 Page_PreInit

2010-06-12 15:35:28 192 TestUserControl.Page_Init

2010-06-12 15:35:28 202 Page_Init

2010-06-12 15:35:28 202 TestUserControl.TestProperty.Set

2010-06-12 15:35:28 202 Page_InitComplete

2010-06-12 15:35:28 202 Page_PreLoad

2010-06-12 15:35:28 202 Page_Load

2010-06-12 15:35:28 202 TestUserControl.Page_Load

2010-06-12 15:35:28 202 TestUserControl.ShowData()

2010-06-12 15:35:28 212 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 212 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 212 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 212 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 212 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 222 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 222 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 222 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 222 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 222 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 232 TestUserControl.Repeater1.ItemDataBound()

2010-06-12 15:35:28 232 Page_LoadComplete

2010-06-12 15:35:28 232 Page_PreRender

2010-06-12 15:35:28 232 TestUserControl.Page_PreRender

2010-06-12 15:35:28 242 Page_SaveStateComplete

2010-06-12 15:35:28 242 TestUserControl.Page_Unload

2010-06-12 15:35:28 252 Page_Unload

2010-06-12 15:35:28 252 Application_PostRequestHandlerExecute

2010-06-12 15:35:28 252 Application_ReleaseRequestState

2010-06-12 15:35:28 252 Application_PostReleaseRequestState

2010-06-12 15:35:28 262 Application_UpdateRequestCache

2010-06-12 15:35:28 262 Application_PostUpdateRequestCache

2010-06-12 15:35:28 262 Application_EndRequest

2010-06-12 15:35:28 272 Application_PreSendRequestHeaders

2010-06-12 15:35:28 272 Application_PreSendRequestContent

2010-06-12 15:35:28 282 Application_BeginRequest

2010-06-12 15:35:28 292 Application_AuthenticateRequest

2010-06-12 15:35:28 292 Application_PostAuthenticateRequest

2010-06-12 15:35:28 302 Application_AuthorizeRequest

2010-06-12 15:35:28 302 Application_PostAuthorizeRequest

2010-06-12 15:35:28 302 Application_ResolveRequestCache

2010-06-12 15:35:28 312 Application_PostResolveRequestCache

2010-06-12 15:35:28 312 Application_PostMapRequestHandler

2010-06-12 15:35:28 322 Application_AcquireRequestState

2010-06-12 15:35:28 322 Application_PostAcquireRequestState

2010-06-12 15:35:28 322 Application_PreRequestHandlerExecute

2010-06-12 15:35:28 332 Application_PostRequestHandlerExecute

2010-06-12 15:35:28 332 Application_ReleaseRequestState

2010-06-12 15:35:28 332 Application_PostReleaseRequestState

2010-06-12 15:35:28 342 Application_UpdateRequestCache

2010-06-12 15:35:28 342 Application_PostUpdateRequestCache

2010-06-12 15:35:28 342 Application_EndRequest

2010-06-12 15:35:28 342 Application_PreSendRequestHeaders

2010-06-12 15:35:28 342 Application_PreSendRequestContent

2010-06-12 15:36:40 034 Session_End

您可能感興趣的文章:
  • 調(diào)試ASP.NET應(yīng)用程序的方法和技巧
  • ASP.NET 應(yīng)用程序級 驗證用戶是否登錄 一般處理程序
  • 驗證一個ASP.NET應(yīng)用程序和頁面的生命周期的實現(xiàn)代碼
  • 淺談ASP.NET MVC應(yīng)用程序的安全性
  • 如何使用ASP.NET制作簡單的驗證碼
  • asp.net之生成驗證碼的方法集錦(一)
  • ASP.NET中驗證控件的使用方法
  • ASP.NET中日歷控件和JS版日歷控件的使用方法(第5節(jié))
  • ASP.NET MVC3網(wǎng)站創(chuàng)建與發(fā)布(1)
  • 簡析ASP.NET網(wǎng)站的創(chuàng)建與發(fā)布過程
  • ASP.NET MVC3模板頁的使用(2)
  • ASP.NET MVC4之js css文件合并功能(3)
  • Asp.Mvc 2.0實現(xiàn)用戶注冊實例講解(1)
  • Asp.Mvc 2.0實現(xiàn)用戶登錄與注銷功能實例講解(2)
  • Asp.Mvc 2.0用戶客戶端驗證實例講解(3)
  • 創(chuàng)建第一個ASP.NET應(yīng)用程序(第1節(jié))

標(biāo)簽:廣元 萍鄉(xiāng) 大理 江蘇 棗莊 衢州 衡水 蚌埠

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Asp.net的應(yīng)用程序?qū)ο蠛晚撁嫔嬷芷凇罚疚年P(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    大宁县| 昭苏县| 威信县| 道孚县| 临沧市| 华容县| 齐齐哈尔市| 利川市| 罗甸县| 固镇县| 白沙| 将乐县| 武邑县| 宜都市| 永登县| 太仓市| 博白县| 阜康市| 青铜峡市| 汉沽区| 体育| 西贡区| 迁安市| 环江| 元阳县| 梧州市| 信阳市| 漠河县| 尖扎县| 武城县| 甘德县| 师宗县| 松溪县| 买车| 枞阳县| 合江县| 北辰区| 东丽区| 藁城市| 沧州市| 秦皇岛市|