1

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

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

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

鸡南

4

2 回答 2

0

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

创建了不同的会话。

但我非常感谢你,因为你让我知道如何解决这个问题

这就是我所做的:我用字典“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());
    }}

感谢您的暂停,并对我迟到的回复感到抱歉

鸡南

于 2010-07-03T19:33:00.553 回答
0

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

在这种情况下,您需要将以下内容添加到您的会话中:

    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

      }
}
于 2010-06-23T14:10:54.480 回答