ASP.NET 例程完全代码版(6)——网站统计模块综述(Session,Application的讨论)

news/2024/5/20 6:27:25/文章来源:https://blog.csdn.net/weixin_34194087/article/details/85183680
在ASP.NET梦工厂群中,有朋友寻网站当前在线人数和所有访问次数的代码,因为正好看到书上有这个例子就应了下来,结果却小弄了好一阵才搞定,不过还真有些需要注意的问题,在此总结,希望和大家共同交流。
    原本在VS2003中默认已经建立的web.config文件和Global.asax,在05下都需要手动添加了,下面就是添加 Global.asax 的界面:手动添加Global.asax
10_689_104f196be89dc03.gif
   
下面是默认生成的Global.asax的代码,和03也有了些许不同,函数的声明也有了小变化。
<%@ Application Language="C#" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e)
    {
        // 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 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.
    }      
</script>
这里需要注意的是 Session_End 事件,只有 InProc 模式支持该事件,也就是说,只有将会话数据存储在 ASP.NET 辅助进程中时才支持该事件。它标志着会话的结束,并用于执行终止该会话所需的所有清除代码。对于要引发的 Session_End 事件来说,必须首先存在会话状态,这意味着必须在该会话状态中存储一些数据,并且必须至少完成一个请求。如果会话状态属性 Mode 为 StateServer 或 SQLServer,则忽略 Global.asax 文件中的 Session_End 事件。如果会话状态属性 Mode 设置为 Custom,则由自定义会话状态存储提供程序决定是否支持 Session_End 事件。
     会话状态的配置是通过设置Web.config文件的<sessionState>节来实现的。下面介绍一下进程内模式的配置方法,它也是默认的会话状态模式。若要使用进程内模式,请将 <sessionState> 元素的 mode 属性设置为 Inproc。
下面显示了进程内模式的一个配置设置示例。
<configuration>
    <system.web>
        <sessionState mode="Inproc"
                      cookieless="false"
                      timeout="20"/>
        </sessionState>
    </system.web>
</configuration>
下面是我的Global.asax的完整代码,其中在线统计的部分借鉴了 MSDN 中的方法,而没有使用 Session 对象,所有访问次数的统计是采用了读写文件的方式,需要在应用程序中加一个 Counter.txt 文本文件。
<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e)
    {
        Application["UsersOnline"] = 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;
        Application["TotalCount"] = obj;
        srd.Close();
    }
   
    void Application_End(object sender, EventArgs e)
    {
        int count = 0;
        count = (int)Application["TotalCount"];
        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 when an unhandled error occurs
}
void Session_Start(object sender, EventArgs e)
    {
        Application.Lock();
        Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
//访问总数加1
        int count = 0;
        count = (int)Application["TotalCount"];
        count = count + 1;
        Application["TotalCount"] = count;
        //将数据记录写入文件
        string file_path = Server.MapPath("counter.txt");
        try
        {
            StreamWriter fs = new StreamWriter(file_path, false);
            fs.WriteLine(count);
            fs.Close();
        }
        catch (Exception ex)
        {
            Application["Error"] = ex.Message;
        }
        Application.UnLock();
    }
void Session_End(object sender, EventArgs e)
    {
        Application.Lock();
        Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
        Application.UnLock();
    }
      
</script>
下面是我的测试页面 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.WebParts;
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 (Application["UsersOnline"] != null)
            {
                //获取当前在线人数
                currentUserNum.Text = Application["UsersOnline"].ToString();
            }
            if (Application["TotalCount"] != null)
            {
                //获取网站总访问人数
                totalUserNum.Text = Application["TotalCount"].ToString();
            }
        }
    }
}
具体的有关会话管理的知识可以查看帮助,这里仅就一个问题和大家讨论,路过者有熟悉的请留言或加QQ:65127444
程序里之所以都使用了 Application ,而没有使用 Session,是因为我使用 <ASP.NET 网络数据库开发实例精解> 一书中第10章的模块 时调试未成功 :(
    下面的代码是这本书中使用 Session 的,可我经过调试,即使多用户同时访问,也还是显示当前在线为1。
它的实现方式是:将以下代码写在 Session_Start 中,然后在 Session_End 中再减1。
   if(Session["CurrentCount"] != null)
   {
    Session["CurrentCount"] = Int32.Parse(Session["CurrentCount"].ToString()) + 1;
   }
   else
   {
    Session["CurrentCount"] = 1;
   }
    然后将 Page_Load 中显示当前人数的Application["UsersOnline"].ToString() 改为 Session["CurrentCount"].ToString(),不管几个用户同时访问,每个人的浏览器显示的当前人数均为 1。
    呵呵,总结到这里,忽然醒悟了,看来总结也是好处不少啊,呵呵,先说说我写到这里时的理解吧:对象 Session 仅被单个用户所共享,所以,每个用户登录时,Session["CurrentCount"] 都为空,所以,都被赋值为1了,似乎这也充分说明了一些写计算机书籍的人的不负责任,呵呵,随便凑合能看就出版了,代码正确率很低啊!至少,我测试得到的不是想要的结果,也许,我个人的理解有偏差?高手路过的请指点一下了!
    当然,利用读写文件的方式,还可以统计最大在线人数。就是将Application["UsersOnline"]的值和用于保存最大在线人数的文件(如:maxcount.txt)中的值比较,大于则重写,小于则不改变即可。有兴趣的可以自己实现一下,呵呵,好累!
    继续努力了一下,呵呵,最大在线人数的也有了:
        //最大在线人数
        DataSet objDataSet = new DataSet();
        objDataSet.ReadXml(Server.MapPath("count.xml"));
        int maxCount = Convert.ToInt32(objDataSet.Tables["MyCount"].Rows[0]["MaxCount"]);
        Application["MaxCount"] = maxCount;
        if (maxCount < (int)Application["UsersOnline"])    //如果MaxCount标签里面的值小于当前在线人数的值,就存入
            objDataSet.Tables["MyCount"].Rows[0]["MaxCount"] = (int)Application["UsersOnline"];
            objDataSet.WriteXml(Server.MapPath("count.xml"));
附:count.xml:
<?xml version="1.0" standalone="yes"?>
<MyCount>
  <MaxCount>0</MaxCount>
</MyCount>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_788360.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在电脑上测试手机网站全攻略

最近公司要开发网站的移动版&#xff0c;让我准备准备知识&#xff0c;话说本人开发移动网站的经验还真不多&#xff0c;最悲剧的事情就是我的手机是个经典的诺基亚&#xff0c;而且公司还不给配手机&#xff0c;这是有多扣啊&#xff0c;没办烦啦&#xff0c;没有手机就用电脑…

优化网站设计(十二):删除重复脚本

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices f…

网站数据库从access升级到sql server 2005

我不知道自己会什么&#xff0c;也不知道自己不会什么&#xff0c;但一段时间苦苦的思索&#xff0c;希望能记录这段时间的探索&#xff0c;以便于以后提高效益。 一、所遇情况环境&#xff1b; 二、初期分析阶段&#xff1b; 三、中期摸索阶段&#xff1b; 四、后期解决阶段&a…

企业网站建设方法论

麦肯锡并不神秘&#xff0c;方法论铸就神奇&#xff01;这是出现在麦肯锡系列丛书封面上非常醒目的一句广告语。博文标题的想法正来源于此&#xff0c;感谢麦肯锡。今天我们要谈论的主角并非麦肯锡&#xff0c;而是方法论&#xff0c;是建设企业网站的方法论。正如标题说言&…

MySQL盈利_个人网站如何盈利

个人网站如何盈利&#xff1f;大多数人第一时间会想到打广告盈利&#xff0c;网站被迫加上一些没有营养或低俗的内容干扰读者阅读&#xff0c;体验十分糟糕&#x1f630;。最近发现有两个个人网站的运营模式很有意思&#xff1a;网站自己不做宣传&#xff0c;如果用户觉得内容优…

seo原创工具_网站seo需要用到哪些工具,seo工具大全

我们在做seo优化的时候&#xff0c;如果有一款合适便捷工具能够辅助到自己&#xff0c;就会事半功倍&#xff0c;对新手来言更是需要这些工具来帮助自己优化自己的网站&#xff0c;小编也准备了相关工具&#xff0c;希望能帮助到大家。seo工具-站长平台首先在seo工作的时候&…

WebMatrixRazor建站系列之WebMatrix介绍

WebMatrix介绍 WebMatrix是微软开发的一个免费的&#xff0c;轻量级Web开发工具。提供了一种简单的方式让我们创建一个站点。它包括IIS Express&#xff08;Web服务器&#xff09;&#xff0c;ASP.NET&#xff08;Web框架&#xff09;&#xff0c;和SQL Server Compact&#xf…

php 怎么添加字体_WP菜鸟建站22:怎样给wordpress主题添加友情连接功能模块?

为了给我们的wordpress网站提升流量&#xff0c;作为站长的我们&#xff0c;往往会通过互换友情链接来方式来为自己的wordpress网站增加外来入口。另外&#xff0c;如果对方的网站对于搜索引擎的权重比较高时&#xff0c;对我们wordpress网站权重会有相应的提升&#xff0c;就好…

网站代码用什么打开_网站打开速度对企业有什么影响?

网站制作一年350元&#xff0c;五站合一&#xff0c;快速建站 &#xff0c;www.sxjcwzjs.com,只需进入网站右上角注册快速建站即可(需要电脑登录注册)&#xff0c;需要联系我吧&#xff01;电话&#xff1a;13752214574&#xff0c;微信号&#xff1a;m1078582894网站打开慢了&…

网站极限优化之php优化

这段时间忙死了&#xff0c;早上一大清早就要起来学计算机英语&#xff0c;听商务英语&#xff0c;前些日子搞数据库优化研究已经有了结果&#xff0c;现在就剩下php优化了&#xff0c;当然了&#xff0c;人各有志&#xff0c;只是发表下个人的看法&#xff0c;大家可以踊跃发表…

设备能力指数cmk计算公式_网站运营数据分析指标及计算公式

做互联网运营的人&#xff0c;不管是网站运营、产品设计或是交互设计等&#xff0c;都需要对网站的一些运营数据做分析&#xff0c;通过数据分析结果做出相应调整&#xff0c;进而达到最优的投资回报。本期&#xff0c;我们给大家整理的是常用的网站运营数据分析指标及计算公式…

js怎么判断点击了哪个li标签的下标_你要知道的企业网站怎么优化?

随着互联网时代的兴起&#xff0c;很多公司都建立了自己的官方网站&#xff0c;但很多公司认为建立官方网站&#xff0c;会有很多用户来到我们的网站&#xff0c;其实这是错误的观点&#xff0c;如果你的公司没有品牌实力如何有人搜索您的网站并点击进入官方网站&#xff1f;建…

php后台html模板_织梦后台一键更新网站、更新文档HTML卡死的解决方法

如果你正在用的是最新版的织梦程序(2018-01-09)&#xff0c;你可能会遇到后台一键更新网站、更新文档HTML卡死的情况&#xff0c;织梦后台一键更新网站、更新文档HTML卡死的解决方法那是因为织梦官方的德得广告服务器挂了&#xff0c;后台生成文档时会加载德得广告库文件与官方…

birt中文手册在线_强烈推荐几个SQL在线刷题的网站

↑ 关注 星标 &#xff0c;后台回复【大礼包】送你Python自学大礼包SQLZOO (⭐⭐) https://sqlzoo.net/上面的网址是一个免费的SQL学习网站——SQLZOO&#xff01;它支持语言&#xff1a;English • 日本語 • 中文(繁体)&#xff0c;不过选择繁体中文后会发现翻译的也一般&a…

搭建 Nginx 静态网站

示例代码&#xff1a;/etc/nginx/nginx.conf user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events { worker_connections 1024;}http { log_format main $remote_addr - $remote…

插入网站连接_第八组 网站开发

DW简介Adobe Dreamweaver&#xff0c;简称“DW”&#xff0c;中文名称 "梦想编织者"&#xff0c;最初为美国MACROMEDIA公司开发&#xff0c;2005年被Adobe公司收购。DW是集网页制作和管理网站于一身的所见即所得网页代码编辑器。利用对 HTML、CSS、JavaScript等内容的…

网站如何记录访客的个人信息?

大多数网站都会带有留言或者评论功能&#xff0c;那么访客在留言或者评论时肯定要记录访客的个人信息&#xff01;这样访客在下一次访问网站时不需要再次填写个人信息&#xff0c;直接评论就ok啦&#xff01;那么怎么记录访客的个人信息呢&#xff1f; 一、利用cookie来记录访客…

linux下yii框架,YII框架网站开发流程

Yii 是什么Yii 是一个基于组件的高性能 PHP 框架&#xff0c;用于快速开发大型 Web 应用。它使Web开发中的 可复用度最大化&#xff0c;可以显著提高你的Web应用开发速度。Yii 这个名字(读作易(Yee) 或 [ji:])代表 简单(easy), 高效(efficient) 和 可扩展(extensible).安装Yii …

网站服务器怎么启动父路径,windows 2000服务器IIS开启父路径的步骤

WebjxCom提示&#xff1a;Windows 2003 IIS启动父路径.“开启父路径”是在Windows 2003开始有这个概念的&#xff0c;之前的windows xp&#xff0c;windows 2000自带的iis是没有“Windows 2003”这个说法的。Windows 2003自带的IIS6.0安装后默认设置是不开启父路径的。“开启父…

使用jenkins配置.net mvc网站进行持续集成一

最近好久没有更新文章了&#xff0c;因为好久没有写代码了&#xff0c;以至于我不知道同大家分享些什么&#xff0c;刚好&#xff0c;今天突然叫我学习下jenkins每日构建&#xff0c;我就把今天的学习笔记记录下来&#xff0c;这其中很多东西都是公司同事之前调研总结的&#x…