2014-12-18 4 views
1

Всякий раз, когда пользователь нажимает на страницу на моем сайте, я запускаю следующий код для отслеживания обращений пользователей, просмотры страниц, где они собираются, и т.д. ...Точного отслеживания сеансов в ASP.NET MVC

public static void AddPath(string pathType, string renderType, int pageid = 0, int testid = 0) 
    { 

     UserTracking ut = (UserTracking)HttpContext.Current.Session["Paths"]; 

     if (ut == null) 
     { 
      ut = new UserTracking(); 
      ut.IPAddress = HttpContext.Current.Request.UserHostAddress; 
      ut.VisitDate = DateTime.Now; 
      ut.Device = (string)HttpContext.Current.Session["Browser"]; 

      if (HttpContext.Current.Request.UrlReferrer != null) 
      { 
       ut.Referrer = HttpContext.Current.Request.UrlReferrer.PathAndQuery.ToString(); 
       ut.ReferrerHost = HttpContext.Current.Request.UrlReferrer.Host.ToString(); 
       ut.AbsoluteUri = HttpContext.Current.Request.UrlReferrer.AbsoluteUri.ToString(); 
      } 
     } 

     //Do some stuff including adding paths 

     HttpContext.Current.Session["Paths"] = ut; 
    } 

В моем файле Global.asax.cs при завершении сеанса я сохраняю эту информацию сеанса. Текущий тайм-аут сеанса установлен на 20 минут.

protected void Session_End(object sender, EventArgs e) 
    {    
     UserTracking ut = (UserTracking)Session["Paths"]; 

     if (ut != null) 
      TrackingHelper.StorePathData(ut); 
    } 

Проблема в том, что я не получаю точное хранение информации. Например, я получаю тысячи сессионных магазинов, которые выглядят так в течение пары минут.

Сессия № 1 Время: 2014-10-21 01: 30: 31,990 Дорожки:/блог IP-адрес: 54.201.99.134

Сессия № 2 Время: 2014-10-21 1:30 : 31,357 Дорожки:/блог-страница-2 IP-адрес: 54.201.99.134

Что следует делать, хранит только одну сессию для этих случаев:

Что сеанс должен выглядеть Время: 2014-10 -21 01: 30: 31,357 Дорожки:/блог,/блог-страница-2 IP-адрес: 54.201.99.134

Очевидно, что это похоже на ползание поисковой системы, но проблема в том, что я не уверен, если это так.

1) Почему это происходит?

2) Как я могу получить точное количество сеансов для соответствия аналитике Google как можно ближе?

3) Как я могу исключить ботов? Или как обнаружить, что это был бот, который уволил его?

Редактировать: Многие люди спрашивают «Почему» Для тех из вас, кто спрашивает «Почему», мы делаем это, а не просто аналитику, чтобы сделать очень длинную историю короткими, мы создаем профили пользователей для моего данные из их профиля. Мы смотрим на то, что они просматривают, как долго они просматривают его, их клики, у нас также есть тесты A/B для определенных страниц, и мы обнаруживаем, какие страницы стреляют во время цикла просмотра пользователей, и мы отслеживание какой-либо другой информации, которая является обычаем, и мы не можем включить ее в API Google Analytics и вытащить эту информацию. Как только они перешли на сайт, мы используем эту информацию для создания профилей пользователей для каждого сеанса на сайте. По существу нам необходимо определить, какая из этих сессий действительно реальна, и дать владельцам сайтов возможность просматривать данные вместе с нашим приложением для интеллектуального анализа данных для анализа данных и предоставления обратной связи владельцам сайтов по определенным критериям, чтобы помочь им улучшить их веб-сайт из этих профилей. Если у вас есть лучший способ сделать это, мы все уши.

+1

Каков ваш конкретный вопрос? Если вы хотите исключить ботов, вам придется либо отслеживать на клиенте (JS), либо идентифицировать и исключать определенные диапазоны IP-адресов или пользовательские агенты. –

+11

Зачем вы это делаете? Та же информация может быть заминирована из ваших журналов сервера, и даже лучше, вы могли бы использовать что-то вроде Google Analytics, которое предоставило бы вам более подробную и полную статистику.В любом случае это будет более точно, чем то, что вы делаете, не потребует дополнительного кода, забивающего ваше приложение, и на него не повлияют такие моменты, как тайм-ауты сеанса. –

+0

Вы вообще не обновляете свои «пути» –

ответ

5

1) сеанс asp.net отслеживается с помощью cookie сессии asp.net. Но он отключен для анонимных пользователей (не зарегистрированных пользователей)

Вы можете активировать создание SESSIONID для анонимного пользователя в web.config

<configuration> 
    <system.web> 
    <anonymousIdentification enabled="true"/> 
    </system.web> 
</configuration> 

намного лучше, чтобы подключить ваш tackin, чтобы добавить глобальный mvc ActionFilterAttribute. Сформированный SessionId хранится в HTTPRequest, доступ

filterContext.RequestContext.HttpContext.Request.AnonymousID 

2) Вы должны создать канал путей отслеживания для Analys его asyncronly или даже не в том же процессе. Возможно, вы хотите сохранить отслеживание на диске «как журнал сервера», чтобы повторно проанализировать его позже.

Географическое положение и поиск db нуждаются в некотором времени обработки, и большинство из них вы не можете получить точное местоположение географии с IP-адреса. Гораздо лучший источник - это получить его из пользовательских профилей/адресов пользователей позже. (после отправки заявки)

Иногда файл cookie asp.net session не работает, потому что у пользователя есть активированный плагин. Google Analytics тоже провалится. Вы можете повысить точность отслеживания с помощью пользовательского обратного вызова клиента a. Чтобы сделать обратный вызов Ajax в глобальном масштабе для всех страниц, вы можете использовать помощь ActionFilterAttribute для вставки некоторого содержимого Script в конец потока ответа HTML-контента.

Для отображения IPv4-адреса на сеанс может помочь, но это должен быть только намек. Noadays много ISP, поддерживающих IPv6. Они набирают там клиентов большую часть времени на небольшой пул IPv4. Таким образом, один пользователь может быстро переключить свой ipv4 на , и существует высокая вероятность того, что посетители одной и той же страницы используют один и тот же интернет-провайдер и, таким образом, используют IPv4.

3) Большинство роботов идентифицируют себя пользовательским агентом пользователя в заголовках запросов. Есть хорошие и плохие. См. http://www.affiliatebeginnersguide.com/articles/block_bots.html

Но с обратным вызовом Ajax u может проверить, что браузер представляет, по крайней мере, настоящее дорогостоящее html-dom с областью JavaScript.

X) Чтобы упростить начало и сосредоточиться на анализе. Реализовать простой ActionFilterAttribute и зарегистрировать его в globaly RegisterGlobalFilters

filters.Add(new OurTrackingActionFilterAttribute(ourTrackingService)); 

В фильтре переопределение OnActionExecuting

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     OnTrackingAction(filterContext); 
    } 

public virtual void OnTrackingAction(ActionExecutingContext filterContext) 
    { 
     var context = filterContext.RequestContext.HttpContext; 

     var track = new OurWebTrack(context); 

     trackingService.Track(track); 
    } 

Чтобы не задерживать ответ сервера с некоторой обработки отслеживания, посмотрите в реакционно пакет http://msdn.microsoft.com/en-us/data/gg577609.aspx

Это хороший способ разделить захват от обработки.

Создайте «тему» ​​в TrackingService и просто нажмите на наши объекты отслеживания. Вы можете писать наблюдатели для передачи, сохранения или обработки объектов отслеживания. По умолчанию наблюдатели будут получать только один объект за раз, поэтому вам не нужно синхронизировать/блокировать свои переменные статуса/каталог/memeory-cache и, возможно, вы хотите загрузить данные и повторно обработать их новой версией вашего приложения позже (возможно, при отладке).

Смежные вопросы