正在为网站创建命中计数器

本文关键字:计数器 创建 网站 | 更新日期: 2023-09-27 18:22:30

我正在创建一个有主页的网站。我想创建一个点击计数器来记录访客数量,我找到了一个代码并将其放在我的主页中。代码如下:标记代码:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="counter.ascx.cs" Inherits="counter" %>
<asp:Label ID="lblCounter" runat="server"></asp:Label>

代码隐藏-C#:

protected void Page_Load(object sender, EventArgs e)
{
 this.countMe();
 DataSet tmpDs = new DataSet();
 tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
 lblCounter.Text = tmpDs.Tables[0].Rows[0]["hits"].ToString();
}
private void countMe()
{
 DataSet tmpDs = new DataSet();
 tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
 int hits = Int32.Parse(tmpDs.Tables[0].Rows[0]["hits"].ToString());
 hits += 1;
 tmpDs.Tables[0].Rows[0]["hits"] = hits.ToString();
 tmpDs.WriteXml(Server.MapPath("~/counter.xml"));
}

根目录中用于使代码工作的xml文件。XML文件为:

 <?xml version="1.0" encoding="utf-8" ?>
 <counter>
   <count>
      <hits>0</hits>
   </count>
 </counter>

但每当我访问我网站的每一个页面时,它们都会触发计数器。请帮助我修改此代码,使一个访问者只触发一次计数器。

我决定只把代码放在索引页上,但每次刷新和每次点击打开索引(即使停留在索引页)都会触发计数器。

正在为网站创建命中计数器

为什么不添加一个会话?我认为这是XML解决方案最简单的方法,如果您将其保存到SQL中,则可以包含更多的逻辑。

private void countMe()
{
 if(Session["Counted"]==null){
 DataSet tmpDs = new DataSet();
 tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
 int hits = Int32.Parse(tmpDs.Tables[0].Rows[0]["hits"].ToString());
 hits += 1;
 tmpDs.Tables[0].Rows[0]["hits"] = hits.ToString();
 tmpDs.WriteXml(Server.MapPath("~/counter.xml"));
 Session["Counted"] = "Yes";
}
}

您需要检查页面的url,以查找计数器来点击代码。试试这个

protected void Page_Load(object sender, EventArgs e)
{
   string url = HttpContext.Current.Request.Url.AbsoluteUri;
   if(url.Contains("index.aspx")
   {
     this.countMe();
   }
   DataSet tmpDs = new DataSet();
   tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
   lblCounter.Text = tmpDs.Tables[0].Rows[0]["hits"].ToString();
}

您可以从Global.ascx文件中获取解决方案。转到应用程序中Golobal.ascx.cs的代码隐藏。在Global.Cs文件中声明一个变量。并在Global.ascx.cs文件的"Session_Start"函数中维护计数;编写一些公共方法来获取用户计数

例如:

protected void Session_Start(Object sender, EventArgs e)
{
  totalNumberOfUsers += 1;
  currentNumberOfUsers += 1;
}

protected void Session_End(Object sender, EventArgs e)
{
  currentNumberOfUsers -= 1;
}
public static int TotalNumberOfUsers
{
  get
  {
    return totalNumberOfUsers;
  }
}
public static int CurrentNumberOfUsers
{
  get
  {
    return currentNumberOfUsers;
  }
} 

除了像探矿者示例中那样使用"Session"之外,由于可能存在同步问题,请不要忘记在使用之前锁定数据集。

private static readonly object LockObj = new object();
private static DataSet dataSet = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
    if (Session["Counted"] == null)
    {
        lock (LockObj)
        {
            dataSet.ReadXml(Server.MapPath("~/counter.xml"));
            dataSet.Tables[0].Rows[0]["hits"] = (1 + int.Parse(dataSet.Tables[0].Rows[0]["hits"].ToString())).ToString();
            dataSet.WriteXml(Server.MapPath("~/counter.xml"));
            dataset.clear();
        }
        Session["Counted"] = "true";               
    }
}