今天早上做了ASP.NET页面计数器的实验,用的是简单的文本文件来存储计数器的数值(
实际是以Byte类型值进行的存储),原理代码可见我以前发的《简单计数器实现程序》。
今天的任务是把原来WinForm中的文件读写放入到ASP.NET的BehindCode中,这就会出现
些许问题。
问题一:文件路径
在ASP.NET的BehindCode中写文件路径就不能因为文件在这个应用程序的目录下直接写文
件名来调用了。
例:
以前使用WinForm编程的时候,如果文本文件Count.txt跟程序的可执行文件在一个目录
下可直接使用FileStream fs=File.Open("Count.txt",FileMode.Open);来对文件进行读
取。
而在ASP.NET中,Web应用程序的路径是"虚路径",意思是没有映射为系统当前应用程序
默认路径(系统当前默认路径应该为C:\windows\system32,原因是此路径下面有Web应用
程序可供调用的丰富的Win32API)。那么虚拟路径的根是存储在什么地方呢?应该是在I
IS的配置文件中,在C#中这个路径就是通过Server.MapPath()函数来映射的。
例:
如果Count.txt文件在此Web应用程序的目录下,可以通过Server.MapPath("../Count.tx
t");来映射到这个文件。注:直接写文件名会找不到此文件,显示的是文件无法读取的
信息。
问题二:
Web应用程序事件问题
其实ASP.NET的通讯及访问模型中有三个层次
第一个层次就是Application,是Web应用程序层
此层次的变量周期为整个Application,不过在Application_Start和Application_End两
个事件中运行的代码,只有在应用程序开始或结束的时候才能进行(服务器启动/关闭或
者强制IIS把此应用程序启动/关闭的时候),因此在这两个事件中写计数器代码是无用
的。
第二个层次是Session,是Web应用程序的一个通信层
一次与用户的通信(从以一个IP访问应用程序开始,到这个IP与应用程序断开或超时断
开)对计数器来说是最有价值的体现,也是一个页面计数器的功能。
不过问题也随之出现了:
Session的Session_Start和Session_End事件是在一次通讯的开始和结束才被激发的。这
样如果在Session_Start实件中写代码的话,只有一次通讯开始时访问的页面上才有计数
器的显示,而在刷新后页面显示计数器的部分就不会再显示了,怎么办?不用着急请继
续往下看。
第三个层次是Page层,是每个页面即Web Document的控制对象层。
我们知道了一个Web页面有一个Page层,我们就会了解,一个页面调出的时候将会调用Pa
在此事件中添加计数器计数的代码,计数器就会因为页面刷新一次而增加一,这是我们
不愿意看到的。
怎么办?
很简单,在Session_Start中写计数器计数的代码,在Page_Load中写计数器显示的代码
,这样就可以实现我们需要的功能了。
希望通过这篇文章,能够帮助初学者理解这几个Web应用程序层次及对应的事件,有时可
能有对问题的错误见解,希望能有高手指教。