我面临一个老问题,这让我非常困惑。所以我需要你的建议,以确保我一直在使用正确的方式。 我的要求是计算我网站上的访问者数量,所以我在Global.asax文件中编码:
void Application_Start(object sender, EventArgs e)
{
// Get total visitor from database
long SiteHitCounter = 0;
int CurrentUsers = 0;
SiteHitCounter = MethodToGetTotalVisitorFromDatabase();
Application["SiteHitCounter"] = SiteHitCounter;
Application["CurrentUsers"] = CurrentUsers;
}
void Application_End(object sender, EventArgs e)
{
// Update total visitor to database when application shutdown
MethodToUpdateTotalVisitorToDatabase((long)Application["SiteHitCounter"]);
}
void Session_Start(object sender, EventArgs e)
{
// Increase total visitor and online user
Application["SiteHitCounter"] = (long)Application["SiteHitCounter"] + 1;
Application["CurrentUsers"] = (int)Application["CurrentUsers"] + 1;
}
void Session_End(object sender, EventArgs e)
{
// Decrease online user
Application["CurrentUsers"] = (int)Application["CurrentUsers"] - 1;
}
然后,我在代码文件后面的另一个C#中使用变量Application [“SiteHitCounter”]和Application [CurrentUsers“]在网页上显示它们。 我面临的问题是,当我将网站发布到共享主机时,网站无法像我的数据库那样显示正确的访客总数。
我需要你的建议。
谢谢, 添
答案 0 :(得分:2)
您不能保证会话结束事件将被触发。你也应该调用application.lock来确保更新计数器时没有并发问题。此外,同一个人可能会在您的应用程序生命周期中创建多个会话,因此您可能需要添加IP地址检查以进一步提高准确性
答案 1 :(得分:1)
检查链接..
Setting an Application("Counter") in the global.asax
您应该在更新之前锁定变量,因为它现在已共享。
void Session_Start(object sender, EventArgs e)
{
// Increase total visitor and online user
Application.Lock();
Application["SiteHitCounter"] = (long)Application["SiteHitCounter"] + 1;
Application["CurrentUsers"] = (int)Application["CurrentUsers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
// Decrease online user
Application.Lock();
Application["CurrentUsers"] = (int)Application["CurrentUsers"] - 1;
Application.UnLock();
}
如果你想公平地对ip进行一些检查,那么没有人可以进行多次会话。
答案 2 :(得分:0)
访问者是请求1页的人。在请求之后无法知道他们是否在您的网站上,就像他们当前正在阅读您的网页一样。
会话从第一个请求的页面开始,并在20分钟后过期,即使用户刚刚在会话的第一秒请求了1页然后离开。
因此,没有真正的方法可以了解您在特定时刻有多少访客。
您可以创建一个包含访问IP地址的列表并注册访问时间。 然后,您可以在20分钟之后使用计时器自行使这些条目到期。它也会使来自同一IP的重复会话无效。