前言
主頁計數器是用來記錄頁面曾經被訪問次數的組件。它是一個比較簡單的功能,但是實現起來卻有許多實際問題要考慮。例如訪問次數的記錄如何存放?如果服務器關機,數據記錄是否會丟失?等等問題都是需要我們考慮的。
目前的計數器主要是使用ASP技術製作,方法非常簡單。但是很少有使用ASP.NET技術製作的計數器,原因主要是ASP.NET技術還未正式發佈,同時支持.NET的服務器還很少導致的。本文講述瞭如何利用ASP.NET技術,製作主頁計數器。
設計構思
計數器的核心工作就是想辦法將訪問的次數記錄下來,並且能夠方便的讀出數據記錄。在此應用中,擬建立四個文件,一個是webform1.aspx,主要是用於顯示訪問次數記錄,一個counter.txt文件用於存儲訪問次數記錄,還有global.asax和global.asax.cs,這兩個文件是核心文件,主要是負責響應事件和讀寫文件。因此,程序必須具有打開文件,讀文件,累加數值,寫文件等功能。同時,還需注意:在進行數值累加時,不能象ASP中的那樣寫成
application(“counter”)=application(“counter”)+1
因爲數值類型不能和對象做數學運算。
經過以上的思考,我們基本就可以編寫代碼了,但是在完成編寫之前,還應瞭解以下的相關知識。
相關知識
1. Global.asax文件
Global.asax文件也稱爲ASP.NET應用程序文件,它一般被放在根目錄下。此文件中的代碼不產生用戶界面,也不相應單個頁面的請求。它主要是負責處理Application_Start,Application_End,Session_Start和Session_End事件的。
2. Application對象及其事件
Application 對象來自HttpApplictionStat 類。它可以在多個請求、連接之間共享公用信息,也可以在各個請求連接之間充當信息傳遞的管道。此對象的生命週期起於IIS開始運行並且有人開始連接時,終止於IIS關閉或者若干時間內無人連接(默認爲20分鐘)。當Application 對象的生命週期開始時,Application_Start 事件會被啓動,當Application對象的生命週期結束時Application_End 事件會被啓動。
3. Session對象及其事件
Session對象有着與Application類似的事件:Session_Start和Session_End事件。當有一個新用戶訪問應用程序時,就會立刻觸發Session_Start事件。當某個用戶停止了訪問或者程序執行了Session.Abandon方法,就會觸發Session_End事件。
4. Application和Session對象比較
Session對象與Application對象有些相似,但其作用域有更大的限制。Application對象是針對所有用戶都生效,而Session對象則相反,每個用戶都有自己的Session對象,它的生命週期起始於服務器產生對用戶請求頁面的相應,終止於用戶斷開與服務器的連接。Application對象不會象Session對象那樣當一個新用戶請求就觸發事件,Application對象的事件只觸發一次,就是在第一個用戶的第一個請求時。一個Application_End事件肯定發生在Session_End事件之後,Application_End事件只有在服務器停止工作或Application_End事件卸載時才觸發。
程序部分
首先建立一個文本文件counter.txt,打開文件輸入一個大於0的整數作爲訪問記錄的初始值。
下面我們就可以正式的編寫計數器的程序了。
listing 1是webform1.aspx,主要是用於顯示從文件中讀出的訪問次數的記錄。由於在整個應用程序生命週期中,Application 對象都是有效的,所以在不同的頁面中都可以對它進行存取,就像使用全局變量一樣方便。
在代碼中,使用<%=Application["counter"]%>來表示訪問次數記錄。
程序代碼如下:
listing1 -----webform1.aspx-----
<%@ Page language="c#" Src="WebForm1.aspx.cs" Inherits="counter1.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<FONT face="宋體">您是第<%=Application["counter"]%>位訪問者!</FONT>
</form>
</body>
</HTML>
Listing 2和listing3是global.asax和global.asax.cs文件代碼,當執行webform1.aspx文件之前會執行它們。在global.asax.cs文件中,定義了一些事件和其響應代碼,主要是用於讀寫文件和數值累加。
Listing 2 -----global.asax----
<%@ Application Src="Global.asax.cs" Inherits="counter2.Global" %>
listing 3 -----global.asax.cs-----
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.IO ;
namespace counter2
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(Object sender, EventArgs e)
{
uint count=0;
StreamReader srd;
//取得文件的實際路徑
string file_path=Server.MapPath ("counter.txt");
//打開文件進行讀取
srd=File.OpenText (file_path);
while(srd.Peek ()!=-1)
{
string str=srd.ReadLine ();
count=UInt32.Parse (str);
}
object obj=count;
Application["counter"]=obj;
srd.Close ();
}
protected void Session_Start(Object sender, EventArgs e)
{
Application.Lock ();
//數值累加,注意這裏使用了裝箱(boxing)
uint jishu=0;
jishu=(uint)Application["counter"];
jishu=jishu+1;
object obj=jishu;
Application["counter"]=obj;
//將數據記錄寫入文件
string file_path=Server.MapPath ("counter.txt");
StreamWriter fs=new StreamWriter(file_path,false);
fs.WriteLine (jishu);
fs.Close ();
Application.UnLock ();
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
}
protected void Application_EndRequest(Object sender, EventArgs e)
{
}
protected void Session_End(Object sender, EventArgs e)
{
}
protected void Application_End(Object sender, EventArgs e)
{
//裝箱
uint js=0;
js=(uint)Application["counter"];
//object obj=js;
//Application["counter"]=js;
//將數據記錄寫入文件
string file_path=Server.MapPath ("counter.txt");
StreamWriter fs=new StreamWriter(file_path,false);
fs.WriteLine(js);
fs.Close ();
}
}
}
小結
經過以上的討論,一個簡單的主頁計數器就完成了。其核心就是以文本模式進行文件讀寫。