application對象(httpapplicationstate 類型,譯者按:application對象是httpapplication類的一個屬性,是web應用程式全域唯一的,web應用程式第一次有請求進來的時候建立的) 是我們在web應用程式內儲存全域資訊的地方,application對象是一個很方便的儲存全域資訊的地方,例如儲存資料庫教程的連接字串:
private void page_load(object sender, system.eventargs e)
{
string connectionstring = application["connectionstring"].tostring();
. . .
}
你也可以在httpapplication類中聲明靜態成員變數來儲存應用程式狀態資訊,例如,上例中的資料庫連接字串可以用如下方式儲存。
public class global : system.web.httpapplication
{
public static readonly string connectionstring = "connection information";
. . .
}
可以在asp教程.net代碼的任何地方訪問該靜態成員變數,例如:string connectionstring = global.connectionstring;
非常重要的一點是,如果你想讓該字串可以全域範圍內被訪問到,則該字串必須聲明為靜態成員變數(你也可以建立一個靜態屬性)。
相反,如果你在global類型使用一般成員變數(非靜態),則只能用來儲存請求狀態,舉個例子來說明,下面的代碼將在調試視窗中輸出所有請求的處理時間(毫秒)
public class global : system.web.httpapplication
{
protected datetime beginrequesttime;
protected void application_beginrequest(object sender, eventargs e)
{
beginrequesttime = datetime.now;
}
protected void application_endrequest(object sender, eventargs e)
{
string messageformat = "elaps教程ed request time (ms) = {0}";
timespan difftime = datetime.now - beginrequesttime;
trace.writeline(
string.format(messageformat, difftime.totalmilliseconds ) );
}
. . .
}
好,現在讓我們回到上面關於儲存應用程式狀態的話題。那個方法更好的呢:在application對象中儲存對象的引用,還是在global類中聲明靜態成員或屬性?各種方式各有優劣。在global類中儲存全域靜態成員可以使你的資料訪問具有強型別,不象application對象,你不需要進行類型轉換,下面的代碼說明了它們的區別:
dataset cacheddata = (dataset)application[“mydataset”];
string mystring = application[“mystring”].tostring();
dataset cacheddata = global.mydataset;
string mystring = global.mystring;
強型別使你的的代碼更加清晰和強壯,在應用程式效能要求比較高的情況下,這種方式可以避免運行時類型轉換帶來的效能損失。如果你儲存的是實值型別的資料,強型別還可以避免裝箱(boxing)和卸箱(unboxing)所帶來的效能損失。另外,application對象還有因為線程同步造成的鎖定所帶來的效能上問題。如果你的全域資料只初始化一次,再也不會改變,使用global類中的靜態成員可以避免鎖定帶來的效能損失。但,如果你採用了這種方式,強烈推薦你使用訪問器(屬性),以保證該變數是唯讀。如果你既要讀又要寫在global類中的靜態成員變數,記住要保證安全執行緒。application對象通過擷取讀寫鎖已經內在的提供了安全執行緒保證。
看一下利用asax檔案做網站計數器
添加了global.asax,app_code檔案夾下global.asax.cs,文字檔site_counter.txt並寫入數字0,代碼分別如下:
global.asax
<%@ application inherits="linker.global" language="c#" %>
global.asax.cs
using system;
using system.data;
using system.configuration;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.io;
namespace linker
...{
/**//// <summary>
/// global 的摘要說明
/// </summary>
public class global : httpapplication
...{
public global()
...{
//
// todo: 在此處添加建構函式邏輯
//
}
protected void application_start(object sender, eventargs e)
...{
// 在應用程式啟動時啟動並執行代碼
streamreader rd = new streamreader(server.mappath("site_counter.txt"));
application.lock();
application["site_counter"] = int.parse(rd.readline());
application.unlock();
rd.close();
}
protected void session_start(object sender, eventargs e)
...{
// 在新會話啟動時啟動並執行代碼
application.lock();
application["site_counter"] = convert.toint32(application["site_counter"]) + 1;
application.unlock();
streamwriter wt = new streamwriter(server.mappath("site_counter.txt"), false);
application.lock();
wt.writeline(application["site_counter"]);
application.unlock();
wt.close();
}
}
}
然後在需要顯示的頁面顯示系統 就可以了
比如簡單的:
label_site_counter.text = convert.tostring(application["site_counter"]);