[C#]計數器


     前言
  主頁計數器是用來記錄頁面曾經被訪問次數的組件。它是一個比較簡單的功能,但是實現起來卻有許多實際問題要考慮。例如訪問次數的記錄如何存放?如果服務器關機,數據記錄是否會丟失?等等問題都是需要我們考慮的。
  目前的計數器主要是使用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 ();
   }
   }
  }
   
  小結
  經過以上的討論,一個簡單的主頁計數器就完成了。其核心就是以文本模式進行文件讀寫。

發佈了55 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章