我想通过webservice来统计软件的使用情况,当启动软件时向服务器的用户表写开始使用时间,正常退出时写一个结束使用时间,来统计用户的在线使用情况。但是有一个问题:用户可能不会正常退出,比如电脑断电了,或是直接从进程里面结束... ... 当这种情况下这个结束使用时间怎么获取呢,很纠结。
各位高手们,有木有好的办法呢????
等待中... ...

解决方案 »

  1.   

    写在Global.asax全局文件中 
    void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
            Application.Add("online", 0);
        }    
       void Session_Start(object sender, EventArgs e) 
        {
            // 在新会话启动时运行的代码
            Application.Lock();
            Application["online"] = (int)Application["online"] + 1;
            Application.UnLock();      
        }
     void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
            // 或 SQLServer,则不会引发该事件。
            Application.Lock();
            Application["online"] = (int)Application["online"] - 1;
            Application.UnLock();
        }
    记住在线人数永远都不可能是个精确的值因为它要受时间和性能的约束
      

  2.   

    给你一个我曾经做过的思路,我以前做的一个播放器,就可以统计1分钟内使用者的数量,具体做法是这样:
    客户端启动以后,查找机器硬件标识(我做的是网卡mac+硬盘id+CPU id)组合起来生成一串代号,基本上可以确定是唯一的了。软件把这个机器代号发送到服务器段,服务器端接收后,查找对比数据库,如果存在,则更新它的在线时间为当前时间,如果不存在,则存入数据也更新时间为当前时间。客户端每隔2分钟就执行一次发送操作,目的就是让服务器定时更改它的在线时间。服务器统计的时候只需要计算当前时间和需要统计时间内在线的机器数量即可。比如要统计3分钟使用人数,那么就查找当前时间往前3分钟内在线的机器就行了,如果客户端关机,或者关闭了软件,那么它的在线状态的时间就不能更新了,超过后就自然不会统计它了,就可以判定它已经离线。
      

  3.   


    这个方法可以实现,当然仍不精准如果确实追求一定准确度,当然要做进数据库,只要服务器不down掉,你总有办法
      

  4.   

    可是这是软件啊,没有加注册用户的,用户打开软件发送mac地址,作为唯一字段,以此来统计有多少人使用的。
      

  5.   

    在Global.ascx文件的Session_Start事件中添加如下代码
    Application.Lock(); 
    Application[ "user_sessions "] = (int)Application[ "user_sessions "] + 1; 
    Application.Unlock(); 
      

  6.   

    大家看好了,楼主说的是桌面应用软件,不是网站,而楼主需要统计一下软件使用情况,就正如QQ音乐的在线,pps的在线一样。其实要精确就还就是不停的发送数据来更改在线时间这个办法比较好。对服务器压力也不大,当然你要说假如有100万人,1000万人同时使用那就不一样了,呵呵。
      

  7.   

    看来只好用定时发送信息到服务器,更新这个mac地址用户的最后使用时间了。
      

  8.   

    光用mac不行,mac可以修改的,而且有时候全是0,给你一段参考代码:
      //获取cpu id和网卡mac
            private void cpuid_mac()
            {
                //获取cpu的id
                string Cpuid = null ;
                ManagementClass cimobject = new ManagementClass("Win32_Processor");
                ManagementObjectCollection moc = cimobject.GetInstances();
                foreach (ManagementObject mo in moc)
                {
                    Cpuid = mo.Properties["ProcessorId"].Value.ToString();
                    mo.Dispose();
                }
                //获取并格式化网卡mac
                string mac = null;
                ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc2 = mc.GetInstances();
                foreach (ManagementObject mo in moc2)
                {
                    if ((bool)mo["IPEnabled"] == true)
                    {
                        mac = mo["MacAddress"].ToString();
                        mac = mac.Replace(":","");
                    }
                    mo.Dispose();
                }
                this.Cpuidandmac = Cpuid + mac;
            }
            //获取在线人数
            private void online(object source, System.Timers.ElapsedEventArgs e)
            {
                System.Timers.Timer t = null;
                if (source is System.Timers.Timer)
                {
                    t = source as System.Timers.Timer;
                }
                t.Stop();
                try
                {
                    WebClient Client = new WebClient();
                    Stream strm = Client.OpenRead(weburl + "winform/" + "online.asp?cpuidandmac=" + Cpuidandmac);
                    StreamReader sr = new StreamReader(strm);
                    string online;
                    online = sr.ReadLine();
                    this.Invoke(new System.Action<object>(delegate { this.label1.Text = "当前在线:" + online + "人"; }), 1);
                    
                }
                catch
                {
                    this.Invoke(new System.Action<object>(delegate { this.label1.Text = "获取在线信息失败"; }), 1);
                }
                t.Interval = 170000;
                t.Start();
            }