【问题标题】:Multiple web sits application visitor counter多个 Web 站点应用程序访客计数器
【发布时间】:2010-06-23 13:57:38
【问题描述】:

我有一个多网站 asp.net 应用程序。 在此应用程序中,不同的域使用相同的页面。 所有页面都继承自名为:PageBase 的基类 从 System.Web.UI.Page 继承。 通过使用:HttpContext.Current.Request.ServerVariables["HTTP_HOST"] 我确定什么是域,然后获取我需要的所有信息 对于这个域,一切正常。

当我想根据会话为每个站点使用不同的访客计数器时,我的问题就开始了。 因为 Global.asax 有全局事件: 会话开始 会话_结束 简单的计数器将所有网站上的所有访问者一起计算。 我尝试为不同类中的 Global.asax 编写代码 但我在那个类中没有得到 PageBase(System.Web.UI.Page) 网站信息。

我将非常感谢任何解决此问题的想法

中南

【问题讨论】:

    标签: asp.net session visitor-statistic


    【解决方案1】:

    我假设您能够在同一会话中从一个“站点”浏览到另一个,并且只创建了一个会话。

    在这种情况下,您需要在 Session 中添加以下内容:

        Session["CountedHosts"] = new List<string>();
    

    然后,在您的基本页面上,添加以下内容:

    var host = Request.ServerVariables["HTTP_HOST"];
    var countedHosts = Session["CountedHosts"] as List<string>;
    if (countedHosts != null && !countedHosts.Contains(host))
    {
        countedHosts.Add(host);
    }
    

    然后在会话结束时,记录访问过的每个主机。

    var countedHosts = Session["CountedHosts"] as List<string>;
    if (countedHosts != null)
    {
         foreach (var host in countedHosts)
         {
              //Log it
    
          }
    }
    

    【讨论】:

      【解决方案2】:

      我无法在每个站点所在的同一会话中从一个“站点”浏览到另一个站点

      创建了不同的会话。

      但我非常感谢你,因为你给了我一个想法 如何解决这个问题

      这是我所做的: 我用字典“onlineList”创建了计数器类,我为每个站点自动创建一个键:

      public abstract class counter{
      public static Dictionary<string, int> onlineList = new Dictionary<string, int>();
      
       //do add one count
      public static void doSiteCountOn(string siteID)
      {
          if (onlineList.ContainsKey(siteID))
          {
              onlineList[siteID] += 1;
          }
          else
          {
              onlineList.Add(siteID, 1);
          }
      }
      
      //do less one count
      public static void doSiteCountOff(string siteID)
      {
          if (onlineList.ContainsKey(siteID))
          {
              onlineList[siteID] -= 1;
          }
          else
          {
              onlineList.Add(siteID, 0);
          }
      }
      
      //get the count
      public static string onlineCount(string siteID)
      {
          if (onlineList.ContainsKey(siteID))
          {
              return onlineList[siteID].ToString();
          }
          else
          {
              return "0";
          }
      }
      
      //reset the count if needed
      public static void resetCount(string siteID)
      {
          if (onlineList.ContainsKey(siteID))
          {
              onlineList[siteID] = 0;
          }
      }}
      

      在我的基本页面上,我检查是否有 Session["siteID"] 如果不是,我启动一个并让我的计数器类将 1 添加到站点计数器:

      if (Session["siteID"] == null){
      Session["siteID"] = _siteID;
      counter.doSiteCountOn(_siteID);}
      

      最后在我的 Session_End 上我少做一个:

      void Session_End(object sender, EventArgs e){
      if (Session["siteID"] != null)
          {
              counter.doSiteCountOff(Session["siteID"].ToString());
          }}
      

      感谢您的支持 抱歉我迟到了

      中南

      【讨论】:

        猜你喜欢
        • 2017-03-20
        • 2018-05-31
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 2014-07-06
        相关资源
        最近更新 更多