Счетчик посещений приложения для нескольких веб-сайтов - PullRequest
1 голос
/ 23 июня 2010

У меня есть несколько веб-приложений 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).

Буду очень признателен за любые идеи по решению этой проблемы

cheinan

Ответы [ 2 ]

0 голосов
/ 03 июля 2010

Я не могу перейти от одного "сайта" к другому в рамках одного сеанса, который есть у каждого сайта, на

создан другой сеанс.

, но я вам очень благодарен, потому чтоВы дали мне представление о том, как решить эту проблему

, вот что я сделал: я создал счетчик класса со словарем "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());
    }}

благодарю за помощь и извиняюсь за поздний ответ

cheinan

0 голосов
/ 23 июня 2010

Я предполагаю, что вы можете переходить с одного "сайта" на другой в рамках одного сеанса и что создан только один сеанс.

В этом случае вам необходимо добавить следующее вваш сеанс:

    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

      }
}
...