帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
ASP.NET计数器
作者:bben_h 发布时间:2005-03-12 来源:ASPCOOL
     前言
  主页计数器是用来记录页面曾经被访问次数的组件。它是一个比较简单的功能,但是实现起来却有许多实际问题要考虑。例如访问次数的记录如何存放?如果服务器关机,数据记录是否会丢失?等等问题都是需要我们考虑的。
  目前的计数器主要是使用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 ();
   }
   }
  }
  
  小结
  经过以上的讨论,一个简单的主页计数器就完成了。其核心就是以文本模式进行文件读写。

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·ASP.NET Authentication Provide  (2005-03-12)
 ·ASP.NET画图全攻略(下)  (2005-03-12)
 ·ASP.NET画图全攻略(上)  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)
 ·ASP.NET虚拟主机的重大安全隐患(  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·放眼未来 帝国近期将有重大举措!
·PHPWind6.3.2版通行证发布
·帝国备份王2008版正式发布
·帝国备份王2008版发布
·phpcms2007转帝国CMS5.0程序发布
·dedecms5.1转帝国CMS5.0程序发布
·帝国网站管理系统V5.0商业购买说明
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统