asp.net 如何精确控制并发用户数?

dl_wang 2009-03-10 05:59:22
asp.net 如何精确控制并发用户数?通过Application 和Session 来累加的话,是不是会由于Session 的过期时间问题导致用户已经退出系统,而Application 的值还是原来的数?如原来在线5人,有1人退出系统,而在线人数还是5?

有什么好方法可以严格控制呢?最好有代码!谢谢!
...全文
236 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dl_wang 2009-03-12
  • 打赏
  • 举报
回复
无满意答案
syx381 2009-03-10
  • 打赏
  • 举报
回复
shenlong0125 2009-03-10
  • 打赏
  • 举报
回复
学习一下
a12321321321312321 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 walkghost 的回复:]
不过还是用IIS来控制好了。
[/Quote]
同意
igelf 2009-03-10
  • 打赏
  • 举报
回复
并发控制. 用lock啊.
dl_wang 2009-03-10
  • 打赏
  • 举报
回复
自己顶一下
a21999 2009-03-10
  • 打赏
  • 举报
回复
up
lxf2000104 2009-03-10
  • 打赏
  • 举报
回复
顶一个
zzxap 2009-03-10
  • 打赏
  • 举报
回复
[code=C#]
网站计数器的实现方法很多,但是在网上查了一下,在Global文件中来实现的比较多,但是有个不是很好的地方,不能实时统计,如果用户不主动注销登陆,则需要等待Session时间过期后才能把这个用户在线情况更新,所以用Global中的OnSessionStart和OnSessionEnd方法只能实现粗略的统计,有时候误差会很大。于是我找到了另外一种方法,按照介绍自己总结出了合适我项目的方法,具体实现如下:
建立一个类AppDate.cs

using System;
using System.Web.UI;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;

namespace myProject
{
public sealed class AppData
{
#region 最高访问人数
private static int _MaxOnlineNumber;
public static int MaxOnlineNumber
{
get
{
return _MaxOnlineNumber;
}
set
{
_MaxOnlineNumber = value;
}
}
#endregion

#region 发生最高访问数时间
private static string _MaxOnlineDate = string.Empty;
public static string MaxOnlineDate
{
get
{
return _MaxOnlineDate;
}
set
{
_MaxOnlineDate = value;
}
}
#endregion

#region 记录在线人情况
private static DataTable _OnlineTable;
public static DataTable OnlineTable
{
set
{
_OnlineTable = value;
}
get
{
if (_OnlineTable == null)
{
_OnlineTable = new DataTable();
DataColumn sessionid = _OnlineTable.Columns.Add("SessionID", typeof(string));
DataColumn sessionIp = _OnlineTable.Columns.Add("IP", typeof(string));
DataColumn sessionStarttime = _OnlineTable.Columns.Add("StartTime", typeof(string));
DataColumn sessionLastActiveTime = _OnlineTable.Columns.Add("LastActiveTime", typeof(string));
DataColumn sessionMacAddr = _OnlineTable.Columns.Add("MacAddr", typeof(string));
}
return _OnlineTable;
}
}
#endregion

//下面用来更新用户在线统计的方法
#region 刷新在线在表
public void refresh()
{
HttpContext _context = HttpContext.Current;
try
{
DataTable dt = GS.SC.BL.AppData.OnlineTable;
string queryForUpdate = "IP='" + _context.Request.UserHostAddress.ToString() + "' and MacAddr='" + GetClientMacAdd() + "'";
DataRow[] dr = dt.Select(queryForUpdate);
if (dr.Length > 0)
{//如果当前SessionID存在,则在他浏览页面时候更新他最后活动时间,使他不会超时退出
for (int i = 0; i < dr.Length; i++)
dr[i]["LastActiveTime"] = DateTime.Now.ToString();
}
else
{//这个是处理如果某个用户在页面上停留超过2分钟而没有退出,当他再次刷新页面时重新统计使他在线,
DataTable odt = GS.SC.BL.AppData.OnlineTable;
DataRow drr;
drr = odt.NewRow();
drr["SessionID"] = _context.Session.SessionID.ToString();
drr["IP"] = _context.Request.UserHostAddress.ToString();
drr["StartTime"] = DateTime.Now.ToString();
drr["LastActiveTime"] = DateTime.Now.ToString();
drr["MacAddr"] = GetClientMacAdd();
odt.Rows.Add(drr);
odt.AcceptChanges();
drr = null;
}

string queryForDelete = "LastActiveTime<'" + DateTime.Now.AddMinutes(-2) + "'";
dr = dt.Select(queryForDelete);
foreach (DataRow eachRow in dr)
{//如果某用户超过2分钟不活动,则把他剔除。
eachRow.Delete();
dt.AcceptChanges();
}
dr = null;
dt = null;
}
catch
{
}
}
#endregion

#region 获取客户端Mac地址
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);
protected string GetClientMacAdd()
{
HttpContext _context = HttpContext.Current;
try
{
//string userip = Request.UserHostAddress;
string strClientIP = _context.Request.UserHostAddress.ToString().Trim();
Int32 ldest = inet_addr(strClientIP); //目的地的ip
//Int32 lhost = inet_addr(""); //本地服务器的ip
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest, 0, ref macinfo, ref len);
string mac_src = macinfo.ToString("X");

while (mac_src.Length < 12)
{
mac_src = mac_src.Insert(0, "0");
}

string mac_dest = "";

for (int i = 0; i < 11; i++)
{
if (0 == (i % 2))
{
if (i == 10)
{
mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2));
}
else
{
mac_dest = "-" + mac_dest.Insert(0, mac_src.Substring(i, 2));
}
}
}

return mac_dest;
}
catch (Exception err)
{
return err.Message;
}
}
#endregion
}

在工程的页面Page_Load中加入myProject.AppData.refresh();即可实现。非常的简单。

[/CODE]
walkghost 2009-03-10
  • 打赏
  • 举报
回复
不过还是用IIS来控制好了。
walkghost 2009-03-10
  • 打赏
  • 举报
回复
application?????

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧