ASP.NET例程完全代码版(6)——网站统计模块综述(Session,Application的讨论))_第1页
ASP.NET例程完全代码版(6)——网站统计模块综述(Session,Application的讨论))_第2页
ASP.NET例程完全代码版(6)——网站统计模块综述(Session,Application的讨论))_第3页
ASP.NET例程完全代码版(6)——网站统计模块综述(Session,Application的讨论))_第4页
ASP.NET例程完全代码版(6)——网站统计模块综述(Session,Application的讨论))_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、http:/ asp.net梦工厂群中, 有朋友寻网站当前在线人数和所有访问次数的代码,因为正好看到书上有这个例子就应了下来,结果却小弄了好一阵才搞定,不过还真有些需要注意的问题,在此总结,希望和大家共同交流。原本在 vs2003中默认已经建立的web.config文件和 global.asax,在 05 下都需要手动添加了,下面就是添加global.asax 的界面: 手动添加global.asax下面是默认生成的global.asax的代码,和03 也有了些许不同,函数的声明也有了小变化。 void application_start(object sender, eventargs e)

2、 / code that runs on application startup void application_end(object sender, eventargs e) / code that runs on application shutdown void application_error(object sender, eventargs e) / code that runs when an unhandled error occurs void session_start(object sender, eventargs e) / code that runs when a

3、 new session is started void session_end(object sender, eventargs e) / code that runs when a session ends. / note: the session_end event is raised only when the sessionstate mode / is set to inproc in the web.config file. if session mode is set to stateserver / or sqlserver, the event is not raised.

4、 这里需要注意的是session_end 事件,只有inproc 模式支持该事件,也就是说,只有将会话数据存储在asp.net 辅助进程中时才支持该事件。它标志着会话的结束,并用于执行终止该会话所需的所有清除代码。对于要引发的session_end 事件来说,必须首先存在会话状态, 这意味着必须在该会话状态中存储一些数据,并且必须至少完成一个请求。如果会话状态属性mode 为 stateserver 或 sqlserver,则忽略global.asax 文件中的session_end 事件。 如果会话状态属性mode 设置为custom,则由自定义会话状态存储提供程序决定是否支持session

5、_end 事件。会话状态的配置是通过设置web.config文件的 节来实现的。 下面介绍一下进程内模式的配置方法,它也是默认的会话状态模式。若要使用进程内模式,请将 元素的mode 属性设置为inproc。下面显示了进程内模式的一个配置设置示例。 下面是我的global.asax的完整代码, 其中在线统计的部分借鉴了msdn 中的方法, 而没有使用session 对象, 所有访问次数的统计是采用了读写文件的方式,需要在应用程序中加一个 counter.txt 文本文件。 void application_start(object sender, eventargs e) applicatio

6、nusersonline = 0; int 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 = int32.parse(str); object obj = count; applicationtotalcount = obj; srd.close(); void a

7、pplication_end(object sender, eventargs e) int count = 0; count = (int)applicationtotalcount; string file_path = server.mappath(counter.txt); streamwriter fs = new streamwriter(file_path, false); fs.writeline(count); fs.close(); void application_error(object sender, eventargs e) / code that runs whe

8、n an unhandled error occurs void session_start(object sender, eventargs e) application.lock(); applicationusersonline = (int)applicationusersonline + 1; / 访问总数加1 int count = 0; count = (int)applicationtotalcount; count = count + 1; applicationtotalcount = count; / 将数据记录写入文件string file_path = server.

9、mappath(counter.txt); try streamwriter fs = new streamwriter(file_path, false); fs.writeline(count); fs.close(); catch (exception ex) applicationerror = ex.message; application.unlock(); void session_end(object sender, eventargs e) application.lock(); applicationusersonline = (int)applicationuserson

10、line - 1; application.unlock(); 下面是我的测试页面webcount.aspx,简单地在页面上加两个lable显示人数即可:using system; using system.data; using system.configuration; using system.collections; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using system.web.ui.webcontrols.webpa

11、rts; using system.web.ui.htmlcontrols; public partial class webcount : system.web.ui.page protected void page_load(object sender, eventargs e) if (!page.ispostback) if (applicationusersonline != null) / 获取当前在线人数currentusernum.text = applicationusersonline.tostring(); if (applicationtotalcount != nul

12、l) / 获取网站总访问人数totalusernum.text = applicationtotalcount.tostring(); 具体的有关会话管理的知识可以查看帮助,这里仅就一个问题和大家讨论,路过者有熟悉的请留言或加qq :65127444 程序里之所以都使用了application ,而没有使用session,是因为我使用 一书中第10 章的模块时调试未成功:( 下面的代码是这本书中使用session 的,可我经过调试,即使多用户同时访问,也还是显示当前在线为1 。它的实现方式是:将以下代码写在session_start 中,然后在session_end 中再减 1 。 if(se

13、ssioncurrentcount != null) sessioncurrentcount = int32.parse(sessioncurrentcount.tostring() + 1; else sessioncurrentcount = 1; 然后将page_load 中显示当前人数的applicationusersonline.tostring() 改为sessioncurrentcount.tostring(),不管几个用户同时访问,每个人的浏览器显示的当前人数均为1。呵呵,总结到这里,忽然醒悟了,看来总结也是好处不少啊,呵呵,先说说我写到这里时的理解吧:对象session 仅被

14、单个用户所共享,所以,每个用户登录时,sessioncurrentcount 都为空,所以,都被赋值为1 了,似乎这也充分说明了一些写计算机书籍的人的不负责任,呵呵,随便凑合能看就出版了,代码正确率很低啊!至少,我测试得到的不是想要的结果,也许,我个人的理解有偏差?高手路过的请指点一下了!当然,利用读写文件的方式,还可以统计最大在线人数。就是将 applicationusersonline的值和用于保存最大在线人数的文件(如: maxcount.txt)中的值比较,大于则重写,小于则不改变即可。有兴趣的可以自己实现一下,呵呵,好累!继续努力了一下,呵呵,最大在线人数的也有了:/ 最大在线人数dataset objdataset = new dataset(); objdataset.readxml(server.mappath(count.xml); int maxcount = convert.toint32(objdataset.tablesmycount.rows0maxcount); applicatio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论