轉–global.asax檔案(網站計數器)

來源:互聯網
上載者:User
 

 利用global.asax,做網站技術器:

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // 在應用程式啟動時啟動並執行代碼
        System.IO.StreamReader srd = new System.IO.StreamReader(Server.MapPath("Counter.txt"));
        int count = int.Parse(srd.ReadLine());
        Application.Lock();
        Application["count"] = count;
        Application.UnLock();
        srd.Close();        
    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //  在應用程式關閉時啟動並執行代碼
        System.IO.StreamWriter swt = new System.IO.StreamWriter(Server.MapPath("Counter.txt"));
        swt.WriteLine(Application["count"]);
        swt.Close();
     }
        
    void Application_Error(object sender, EventArgs e) 
    { 
        // 在出現未處理的錯誤時啟動並執行代碼

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // 在新會話啟動時啟動並執行代碼
        Application.Lock();
        Application["count"] = Convert.ToInt16(Application["count"]) + 1;
        Application.UnLock();
        System.IO.StreamWriter swt = new System.IO.StreamWriter(Server.MapPath("Counter.txt"));
        swt.WriteLine(Application["count"]);
        swt.Close();
    }

    void Session_End(object sender, EventArgs e) 
    {
        // 在會話結束時啟動並執行代碼。 
        // 注意: 只有在 Web.config 檔案中的 sessionstate 模式設定為
        // InProc 時,才會引發 Session_End 事件。如果會話模式設定為 StateServer 
        // 或 SQLServer,則不會引發該事件。
        System.IO.StreamWriter swt = new System.IO.StreamWriter(Server.MapPath("Counter.txt"));
        swt.WriteLine(Application["count"]);
        swt.Close(); 
    }
       /*然後便可以在網頁中要顯示計數器的地方用Appliation["Count"]對象來顯示了。*/
</script>

ps:利用檔案讀寫的方式..則先建立檔案Counter.txt,否則報錯

ps: 然後便可以在網頁中要顯示計數器的地方用Appliation["Count"]對象來顯示了。

 

 

 

 

 

global.asax是一個文字檔,它提供全域可用代碼。這些程式碼封裝括應用程式的事件處理常式以及會話事件、方法和靜態變數。有時該檔案也被稱為應用程式檔案。

global.asax檔案中的任何代碼都是它所在的應用程式的一部分。每個應用程式在其根 目錄下只能有一個global.asax檔案。然而,這個檔案是可選的。如果沒有global.asax檔案,應用程式將對所有事件應用由 HttpApplication類提供的預設行為。

當應用程式啟動並執行時候,global.asax的內容被編譯到一個繼承自HttpApplication類的類中。因此,HttpApplication類中所有的方法、類和對象對於應用程式都是可用的。

CLR監控著global.asax的變化。如果它察覺到這個檔案發生了改變,那麼將自動啟 動一個新的應用程式複本,同時建立一個新的應用程式定義域。原應用程式定義域當前正在處理的請求被允許結束,而任何新的請求都交由新應用程式定義域來處理。當原應用程 序域的最後一個請求處理完成時,這個應用程式定義域即被清除。這有效保證了應用程式可以重新啟動,而不被任何使用者察覺。

為防止應用程式使用者下載應用程式而看到原始碼,ASP.NET預設配置為阻止使用者查看global.asax的內容。如果有人在瀏覽器輸入以下URL:

http://localhost/progaspnet/Global.asax

這將會收到一個403(禁止訪問)錯誤資訊或者類似的資訊如:

This type of page is not served。

提示:簡單而言,web.config檔案與global.asax有些類似的地方。如果這個檔案被更改,應用程式將自動“重啟”。同樣,也不可能在瀏覽器中查看web.config檔案。

Global.asax檔案從外觀和結構上與分頁檔(.aspx)相似。它可以有一個或多個部分,簡要描述如下:

l           指令

l           指令碼塊

l           Object聲明

正如Web頁和Web服務能夠使用程式碼後置功能,global.asax同樣也可以。然而,與Web頁和Web服務的條件有所不同,VS2005預設狀態下不對global.asax使用程式碼後置功能。

提示:Visual Studio 2005預覽版預設對global.asax使用程式碼後置模型。目前仍然支援程式碼後置,但不是預設使用。

為了對global.asax使用程式碼後置技術,可使用位於該檔案頭部的Application指令(類似於分頁檔的Page指令,下一節將詳細介紹)的Inherits屬性,該屬性指向global.asax.cs中的程式碼後置類別。??????????---

同時,也有一個CodeBehind屬性用來指向程式碼後置檔案。然而,如果它指向的是一個位於App_Code檔案夾以外的位置,那麼必須對這個類檔案進行手動編輯。

通過按右鍵方案總管中的網站或者單擊網站菜單,然後選擇“Add New Item...”,接著選擇全域應用程式類,可以為Web應用程式添加一個global.asax檔案。保留預設名稱global.asax。

原始碼如下:

<%@ Application Language="C#" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        // 在應用程式啟動時啟動並執行代碼  
    }
    void Application_End(object sender, EventArgs e) 
    {
        //  在應用程式關閉時啟動並執行代碼
     }  
    void Application_Error(object sender, EventArgs e) 
    { 
        // 在出現未處理的錯誤時啟動並執行代碼
    }
    void Session_Start(object sender, EventArgs e) 
    {
        // 在新會話啟動時啟動並執行代碼
    }
    void Session_End(object sender, EventArgs e) 
    {
        // 在會話結束時啟動並執行代碼。 
        // 注意: 只有在 Web.config 檔案中的 sessionstate 模式設定為
        // InProc 時,才會引發 Session_End 事件。如果會話模式設定為 StateServer 
        // 或 SQLServer,則不會引發該事件。
    }
</script>

l           指令

與Web頁和Web服務檔案相比,global.asax可以以多個指令作為開始。這些指令在處理ASP.NET檔案時指定應用程式編譯的設定。與Page指令相比,Application指令可接受一個或者多個具有字典結構的屬性/值對。此處支援三個指令:Application、Import和Assembly。

Application  Application指令設定編譯器的應用程式專用屬性。以下是一個Application指令樣本:
    <%@ Application  Language="C#" Inherits="WebServiceConsumer.Global"       Description="A sample application" %>
Language屬性可以設定為任何一種標準語言名稱:VB、C#、JS、或VJ#,它們分別對應VB2005、C#、JScript.NET或J#。(可以使用任何一種支援.NET平台的第三方語言)預設值為C#。此處的Language設定的是語言專門用於global.asax檔案,而非其他應用程式代碼檔案。例如,可以完全合法地在global.asax檔案中使用C#,在.aspx檔案中使用VB2005,相反亦然。
      Inherits屬性指定所繼承類名,具有代表性的如程式碼後置檔案中的類。
      Description屬性接受對應用程式的文本描述,而分析器和編譯器將會忽略它。
      CodeBehind屬性在Visual Studio .NET(非VS2005)中用來指定包含的程式碼後置檔案。

Import  Import指令僅包括一個Namespace屬性。所指定名字空間被明確地匯入應用程式中,使其所有的類和介面都可用。匯入的名字空間可以是.NET Framework的一部分或者使用者自訂的名字空間。
以下是一個典型的Import指令:
     <%@ Import Namespace="System.Data" %>
只能有一個Namespace屬性。如果需要匯入多個名字空間,那麼需要使用多個Import指令。

Assembly  Assembly指令用於在編譯過程中將一個程式集連結到當前應用程式。這樣可以使所有程式集的類與介面對應用程式都是可用的。
提示:典型的程式集是.dll或.exe檔案
由於在編譯時間引用程式集,所以可以使用Assembly指令綁定程式集,然後在運行時將其載入到應用程式集區中。

位於應用程式集緩衝(也就是位於bin目錄和App_Code目錄中的代碼檔案)中的程式集可自動連接到應用程式。因此,任何位於bin目錄的程式集,或者由App_Code目錄中的代碼編譯而來的任何程式集,都不需要使用Assembly指令實現串連。

Assembly指令包括兩個屬性:Name和Src。Name屬性是一個字串,表示串連到應用程式的程式集名字,它不能包含路徑。Src屬性則是指向源檔案的路徑(只能為相對路徑),這些檔案將被動態編譯和串連。

每個程式集指令只能有一個屬性。如果需要串連多個程式集,則應使用多個Assembly指令。

Assembly指令類似於:

<%@ Assembly Name="SomeAssembly" %>
<%@ Assembly Src="sources/SomeSourceFile.cs" %>

指令碼塊
典型的global.asax檔案中包含大量代碼,這些程式碼封裝含在以script標籤起止的指令碼塊中:
<script runat="server">
-------
</script>
如果使用程式碼後置,雖然程式碼後置檔案中的代碼本身沒有附加script標籤,但包含在程式碼後置檔案中的代碼與指令碼塊中的代碼是等效的。
指令碼塊中的代碼可以包含事件處理常式或者方法,下文將對此進行講解。
事件
如同Web頁和控制項可以公開事件一樣,應用程式中的Application對象和 Session對象也能夠公開事件。這些事件能被global.asax檔案或指定的檔案中的事件處理常式處理。例如,當應用程式開始執行時,觸發 Application_Start事件;當應用程式結束時,觸發Application_End事件。Application的某些事件是每當頁面請求時觸發,而其他一些事件,例如Application_Error,則僅在特定情況下觸發。
 以下是頁面請求觸發的所有事件,以觸發順序排序:
Application_BeginRequest
當ASP.NET開始處理每個請求時觸發。在這個事件處理中的代碼將在頁面或者服務處理請求之前執行。
Application_AuthenticateRequest
在驗證請求之前觸發。(正如第12章介紹的,驗證是確認使用者就是他所說的那個人的過程)在這個事件處理常式的代碼中允許實現自訂安全管道。
Application_AuthorizeRequest
在為請求授權之前觸發。(授權是確定是否請求使用者具有訪問資源的許可權的過程)在這個事件處理常式的代碼中允許實現自訂安全管道。
Application_ResolveRequestCache
在ASP.NET確定是否應該產生新的輸出,或者由緩衝填充前觸發。無論何種情況,都將執行該事件處理常式中的代碼。
Application_AcquireRequestState
在擷取工作階段狀態之前執行。
Application_PreRequestHandlerExecute
在將請求發送到服務於請求的處理常式對象之前觸發。當事件觸發後,頁面將由HTTP處理常式處理請求。
Application_PostRequestHandlerExecute
當HTTP處理常式與頁面請求一起完成時觸發。此時,Response對象將獲得由用戶端返回的資料。
Application_ReleaseRequestState
當釋放和更新試圖狀態時觸發。
Application_UpdateRequestCache
如果輸出被緩衝,那麼緩衝更新時將觸發。
Application_EndRequest
當請求結束時執行。
Application_PreSendRequestHeaders
在向用戶端發送HTTP頭之前觸發。如果啟用響應緩衝,這意味著直到所有資料都準備好(預設條件),都不會發送任何資料。該事件總是在Application_EndRequest事件之後。如果禁用響應緩衝,那麼無論何時將資料發送給用戶端,都將觸發該事件。響應控制由Page指令的一個屬性,或者Web服務的WebMethod屬性控制。
Application_PreSendRequestContent
向用戶端發送HTTP內容之前觸發。和Application_PreSendRequestHeaders事件一樣,Application_PreSendRequestContent事件能否被觸發取決於響應緩衝是否可用。

以下列舉應用程式事件,它們在特定條件下觸發:
Application_Start
當應用程式啟動時觸發。當首次請求應用程式虛擬目錄中的任何頁面時,將啟動應用程式,同時如果應用程式已經運行,則不觸發該事件。
Application_End
應用程式結束時觸發。無論何時修改了設定檔(global.asax、global.asax.cs、global.asax.vb或者web.config),或者伺服器崩潰或者重啟,應用程式都將結束。通常在該事件處理常式中執行清除功能的代碼,例如關閉資料庫連接。
Session_Start
每個會話開始時觸發,這是放置具體會話代碼的地方。
Session_End
會話結束時觸發。它為儲存儲存在會話中的任何資料提供了機會。
Application_Disposed
當CLR從記憶體中移除應用程式時觸發。
Application_Error

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.