摘要:該文通過程序實例,詳細介紹了在ASP.NET中實現圖形化網站訪問計數器的方法。
關鍵詞:ASP. NET;網站;計數器
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)25-1451-03
Design the Website Access Counter in ASP.NET
LIU Xiao-ying, ZHANG Hui
(Department of Information Engineering, Yellow River Conservancy Technical Institute, Kaifeng 475003, China)
Abstracts: Analyzing many examples of program, the paper introduces the methods how to design the website visitor(access) counter of graphics in ASP.NET.
Key words: ASP.NET; website; counter
1 引言
當我們的動態網站發布到網上后,怎樣得知它的受歡迎程度呢?一個最常用的指標就是網站的訪問次數,網站訪客計數器就是對網站的訪問次數進行統計。因此,實現一個美觀大方又有個性的計數器是大多數網站管理員的所求。利用ASP.NET技術來實現網站訪問計數器簡單方便,其原理也容易被理解,同時計數結果還可以使用漂亮的圖片顯示在主頁上呈現給訪問用戶。
2 設計構思
計數器的核心工作就是想辦法將訪問的次數記錄下來,并且能夠方便的讀出數據記錄。利用ASP.NET技術實現網站訪問計數器,其基本思路如下:當用戶從客戶端訪問網站時,通過讀取服務器硬盤上相應的計數文件,并對計數器文件的數據進行加1操作,把當前的計數值在客戶端進行顯示,然后寫回該計數文件。
在此應用中,要建立三個文件,一個Default.aspx,主要用于顯示訪問次數,一個count.txt文件用于存儲訪問次數。還有Global.asax,這個文件是核心文件,主要負責響應事件和讀寫文件。下面注重分析Global.asax文件。
2.1 Global.asax文件
Global.asax文件也稱為ASP.NET應用程序文件,它一般被放在應用程序根目錄下。此文件中的代碼不產生用戶界面,也不響應單個頁面的請求。它主要是負責處理Application_Start,Application_End,Session_Start和Session_End等事件。
2.2 Application對象及其事件
Application 對象來自HttpApplictionStat 類。它可以在多個請求、連接之間共享公用信息,也可以在各個請求連接之間充當信息傳遞的管道。此對象的生命周期起于IIS開始運行并且有人開始連接時,終止于IIS關閉或者若干時間內無人連接(默認為20分鐘)。當Application 對象的生命周期開始時,Application_Start 事件會被啟動,當Application對象的生命周期結束時Application_End 事件會被啟動。
2.3 Session對象及其事件
Session對象有著與Application類似的事件:Session_Start和Session_End事件。當有一個新用戶訪問應用程序時,就會立刻觸發Session_Start事件。當某個用戶停止了訪問或者程序執行了Session.Abandon方法,就會觸發Session_End事件。
3 網站訪客計數器的具體實現方法
在asp.net中實現網站訪問計數器。需要解決的關鍵問題是使用什么樣的變量充當計數變量,變量的累加操作在什么事件中進行,以及計數結果如何以圖形化的方式顯示。下面結合一個具體的網站訪問計數器實例詳細說明。
3.1 創建文本文件,保存訪客次數
任何變量都有生命周期,當Web服務器重啟時,計數變量將重新初始化。因此需要建立文本文件count.txt將計數的結果保存下來。
count.txt文件要想被asp.net應用程序讀寫,需要在文件的安全屬性中添加aspnet用戶,并設置該用戶訪問count.txt的權限為可寫。 具體做法:
打開count.txt的屬性頁,選擇“安全”選項卡,單擊“添加”按鈕,添加asp.net用戶,并在權限中選擇讀取和寫入,如圖1所示。
3.2 定義計數變量
3.2.1 確定計數變量類型
定義計數變量的關鍵是要確定變量的類型。通過分析可以得出,用于計數的變量有一個特點,就是所有訪問網站的用戶都可以讀取和修改它。在Asp.net中,只有 Application變量符合以上特點。
因此,我們聲明一個變量Application[“count”]作為計數變量。
3.2.2 計數變量讀取count.txt初始化
運用Server.MapPath(“count.txt”)方法得到count.txt文件的路徑,運用file類的OpenText方法創建一個StreamReader對象,并將返回的對象賦值給mySR, 然后運用StreamReader類的ReadLine方法讀取文件內容,最后,將讀到的數值賦給Application[\"count\"]。
3.2.3 將程序代碼寫入Application_star事件
如果頻繁地進行文件的讀寫,是必要影響程序的運行速度。因此,我們可以將讀文件的操作放置在Application_star事件當中。該事件在整個ASP.NET應用程序第一次被觸發的事件,也就是說在一個虛擬目錄中第一個ASP.NET應用程序執行時觸發。之后,在應用程序關閉之前,該事件將不再觸發。我們將讀文件的操作寫入該事件中,在整個應用程序運行其間,該操作只進行一次。
具體代碼如下:
protected void Application_Start(Object sender, EventArgs e)
{
int count=0;
StreamReader mySR;
string myFilePath=Server.MapPath (\"count.txt\");
mySR=File.OpenText (myFilePath);
while(mySR.Peek ()!=-1)
{
string str=mySR.ReadLine ();
count=Int32.Parse (str);
}
Application[\"count\"]=count;
mySR.Close ();
}
3.3 當每一個用戶訪問網站內的網頁時,計數變量累加
由于application[“count”] 變量是所有用戶共享的,為了避免修改時出現爭用、死鎖或訪問沖突,在對Application變量進行修改時,必須先將其鎖定,修改完之后進行解鎖。
下面關鍵是要確定計數變量累加的代碼寫在什么事件中。
當每個用戶從客戶端瀏覽器中首次與網站建立連接時(首次訪問網站中的任意一個網頁),他就與這個服務器建立了一個Session(會話),服務器會為其創建一個Session對象。同時觸發Session_Start事件。
Session對象有一個有效期,默認為20分鐘。有時候使用者正在瀏覽網頁時,突然去做其他的事情而沒有把網頁關閉;如果 服務器一直浪費資源在管理這些Session 上,那么勢必會讓服務器的效率降低。所以當使用者超過一段時間沒有動作時,我們就可以將Session釋放。這個時間就是Session的有效期。
此后,只要用戶在同一瀏覽器中訪問網站中任意網頁,或者在Session有效期內刷新網頁時,該事件不再觸發。我們將累加代碼寫在Session_star事件中,將能夠實現:
1) 訪客首次瀏覽網站中的任意一個網頁時計數器加1,默認時間內訪問其他網頁或者刷新頁面,計數器將不會累加。
2) 訪客超過默認時間后再次訪問網站或者刷新網頁,訪問人數將加一。
本步驟的具體代碼如下:
protected void Session_Start(Object sender, EventArgs e)
{
Application.Lock ();--加鎖
count=(int)Application[\"count\"];
count=count+1;
object obj=count;
Application[\"count\"]=obj;
Application.unlock();--解鎖
}
3.4 以圖形模式顯示訪客數值
我們需要將訪客數值顯示在頁面上,為了增加網頁的趣味性,可以用圖片顯示數字。為此,首先要準備0-9的GIF圖形文件:0.gif、1.gif、2.gif...9.gif,分別用來顯示10個數字,然后利用循環,一一取出計數變量中的數字字符,再將字符映射到GIF圖形文件,使用Response對象的Write方法,將其顯示在網頁上。程序代碼放在Default.aspx程序中的Page_Load事件中。
protected void Page_Load(object sender, System.EventArgs e)
{
int i;
string strCounter=Application[“count”].ToString();
string imgName;
Response.Write(\"您是第\");
for( i = 0 ; i { imgName = strCounter.Substring(i,1); Response.Write(\" } Response.Write(\"位訪問者\"); } 3.5 將Application[“count”]中的數值寫入count.txt文件 最后,運用StreamWrite類的WriteLine方法將最終的Application[\"count\"]的值寫入count.txt文件。該事件代碼可放在Application_End事件中。具體代碼如下: protected void Application_End(Object sender, EventArgs e) { int count=0; count=(int)Application[\"count\"]; //將數據記錄寫入文件 string myFilePath=Server.MapPath (\"count.txt\"); StreamWriter mySW=new StreamWriter(myFilePath,1); mySW.WriteLine(count); mySW.Close ();} 3.6 運行結果 計數器制作完畢后,通過瀏覽器調用可以得到如圖2所示的結果。 ■ 圖2 4 結束語 以上程序使用VC#編寫,在VS.NET 2005環境下調試通過,希望能給對ASP.NET編程有興趣的朋友一些啟發。 參考文獻: [1] 王華章. ASP.NET 2.0網絡系統開發使用教程[M].北京:中國鐵道出版社,2006.
\");