我想通过webservice来统计软件的使用情况,当启动软件时向服务器的用户表写开始使用时间,正常退出时写一个结束使用时间,来统计用户的在线使用情况。但是有一个问题:用户可能不会正常退出,比如电脑断电了,或是直接从进程里面结束... ... 当这种情况下这个结束使用时间怎么获取呢,很纠结。
各位高手们,有木有好的办法呢????
等待中... ...
各位高手们,有木有好的办法呢????
等待中... ...
调试欢乐多
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();
}
记住在线人数永远都不可能是个精确的值因为它要受时间和性能的约束
客户端启动以后,查找机器硬件标识(我做的是网卡mac+硬盘id+CPU id)组合起来生成一串代号,基本上可以确定是唯一的了。软件把这个机器代号发送到服务器段,服务器端接收后,查找对比数据库,如果存在,则更新它的在线时间为当前时间,如果不存在,则存入数据也更新时间为当前时间。客户端每隔2分钟就执行一次发送操作,目的就是让服务器定时更改它的在线时间。服务器统计的时候只需要计算当前时间和需要统计时间内在线的机器数量即可。比如要统计3分钟使用人数,那么就查找当前时间往前3分钟内在线的机器就行了,如果客户端关机,或者关闭了软件,那么它的在线状态的时间就不能更新了,超过后就自然不会统计它了,就可以判定它已经离线。
这个方法可以实现,当然仍不精准如果确实追求一定准确度,当然要做进数据库,只要服务器不down掉,你总有办法
Application.Lock();
Application[ "user_sessions "] = (int)Application[ "user_sessions "] + 1;
Application.Unlock();
//获取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();
}