2010-08-14 2 views
2

Я столкнулся со старой проблемой, которая заставила меня смутить очень много. Поэтому мне нужен ваш совет, чтобы убедиться, что я правильно использую. Моего спроса подсчитать количество посетителей на моем сайте, так что я закодирован в 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; 
} 

Затем я использовал переменную Application [ «SiteHitCounter»] и применение [CurrentUsers "] в другой C# за кодом файла, чтобы показать их на веб-странице. Проблема, с которой я сталкиваюсь, заключается в том, что на веб-сайте не может отображаться правильный общий номер посетителя, как в моей базе данных, когда я публикую его на общем хосте.

Мне нужен ваш консультации по этому вопросу.

Thanks, Tien

+0

Просто используйте http://www.google.com/analytics/ и позвольте им разобраться с проблемой :) –

ответ

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, чтобы никто не мог делать несколько сеансов.

+0

Идеальный Ажар, я попытаюсь выполнить проверку ip позже. Сейчас я буду использовать ваши вещи. Большое спасибо! –

+0

приветствуем .... если ответ соответствует вашей цели, тогда примите ответ, который поможет другим попробовать правильный метод для своего вопроса simmiler. благодаря – Azhar

2

вы не можете гарантировать, что событие окончания сеанса будет срабатывать. также вы должны вызвать application.lock, чтобы убедиться, что при обновлении счетчика нет проблем с параллелизмом. Кроме того, вполне возможно, что тот же человек будет создавать несколько сеансов в течение жизни вашего приложения, так что вы можете добавить IP-адрес проверки для дальнейшего повышения точности

+0

oh, спасибо за ваш ответ. –

1

Посетитель - это тот, кто просит 1 страницу. Невозможно узнать, являются ли они «включенными» на ваш сайт после запроса, например, если они в настоящее время читают вашу страницу.

Сессия начинается с первой запрашиваемой страницы и истекает через 20 минут, даже если пользователь только что запросил 1 страницу в 1-й секунде сеанса, а затем ушел.

Таким образом, нет реального способа узнать, сколько посетителей у вас есть в данный момент.

Вы можете создать список с посещенными IP-адресами и зарегистрировать время посещения. Вы можете закончить эти записи самостоятельно таймером, скажем, через 20 минут. Это также лишило бы дублирование сеансов, исходящих из одного и того же IP-адреса.