отслеживать информацию о посетителях по каждому запросу - PullRequest
1 голос
/ 25 апреля 2011

Используя веб-формы Asp.net, я хочу отслеживать информацию о посетителях так же, как это делает Google Analytics. Конечно, я могу использовать Google Analytic для этой цели, но я хочу знать, как я могу добиться того же с Asp.net 3.5 и SQL Server 2008.

Я хочу сохранить IP, Страна, URL Реферер посетителя, Разрешение при каждом запросе страницы, кроме обратной передачи. Я ожидаю 50 000 посещений каждый день. .

Главное, что я хочу сделать так, чтобы он не блокировал текущий запрос.

Т.е. в общем случае, когда мы сохраняем данные в db, текущий запрос останавливается для определенного состояния вызова SP и продвигается, когда он завершает выполнение оператора SP или tsql. Я хочу следовать подходу «вставь и забудь». Он должен вставляться в фоновом режиме, когда я передаю параметр определенному событию или функции.

Я нашел следующие варианты для этого:
1. PageAsynchTask
2. BeginExecuteNonQuery
3. Метод Jquery Post и Webservice (но я не уверен в этом, и мне интересно, как мне это сделать)

Надеюсь, я правильно упомянул о своей проблеме.

Кто-нибудь может сказать мне, какой из них лучше подходит? Также дайте мне знать, если у вас есть другие идеи или лучший подход, чем перечисленные. Ваша помощь будет по достоинству оценена.

Ответы [ 4 ]

1 голос
/ 07 мая 2011

Проблемы с любым фоновым потоком на стороне сервера - каждый запрос будет занимать два потока. Один для обслуживания запроса ASP.NET и один для регистрации материала, который вы хотите зарегистрировать. Таким образом, у вас возникают проблемы с масштабируемостью из-за исчерпания потоков ASP.NET. И регистрация каждого запроса в базе данных является большой нет, нет.

Лучше всего просто записывать файлы журналов, используя высокопроизводительную библиотеку журналов. Библиотеки журналов высоко оптимизированы для многопоточных журналов. Они не производят вызовы ввода / вывода при каждом вызове. Журналы хранятся в буфере памяти и периодически очищаются. Вы должны использовать EntLib или Log4net для регистрации.

Вы можете использовать HttpModule, который перехватывает каждый GET, POST, а затем внутри HttpModule вы можете проверить, является ли Request.Url aspx или нет. Затем вы можете прочитать Request.Headers ["__ ASYNCPOST"] и посмотреть, является ли оно "true", что означает асинхронное обновление UpdatePanel. Если все эти условия выполняются, вы просто регистрируете запрос в файле журнала, в котором хранится

Вы можете получить IP клиента от:

HttpContext.Current.Request.UserHostAddress; 
or 
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

Чтобы получить IP-адрес устройства, а не прокси-сервера, используйте следующий код

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

Однако вы не можете получить страну. Вам нужно будет зарегистрировать IP-адрес в своих файлах журналов, а затем обработать файлы журналов, используя какое-либо консольное приложение или задание, которое определит страну IP. Вам нужно получить некоторую базу данных IP-> Country, чтобы сделать работу. Я использовал http://www.maxmind.com/app/geoip_country раньше.

Для размера экрана вам придется положиться на некоторый JavaScript. Используйте javascript на каждой странице, который определяет размер экрана на стороне клиента и сохраняет его в файле cookie.

var screenW = 640, screenH = 480;
if (parseInt(navigator.appVersion)>3) {
 screenW = screen.width;
 screenH = screen.height;
}
else if (navigator.appName == "Netscape" 
    && parseInt(navigator.appVersion)==3
    && navigator.javaEnabled()
   ) 
{
 var jToolkit = java.awt.Toolkit.getDefaultToolkit();
 var jScreenSize = jToolkit.getScreenSize();
 screenW = jScreenSize.width;
 screenH = jScreenSize.height;
}

Как только вы сохраните его в файле cookie (я не показал этот код), вы можете прочитать размеры экрана из модуля HttpModule, используя Request.Cookies, а затем зарегистрировать его в файле журнала.

Таким образом, это дает вам решение для регистрации IP, экранирования, поиска страны по IP и фильтрации асинхронной обратной передачи UpdatePanel из журнала.

Это дает вам полное решение проблемы?

0 голосов
/ 04 мая 2011

Hii, Вы можете запустить асинхронный запрос и не ждать ответа. здесь у меня есть некоторый реализованный код ..

для этого вам нужно создать веб-сервис для выполнения операций с базой данных или использовать его для всей обработки событий.

со стороны сервера вы должны вызывать веб-сервис асинхронно, как это

Объявление частного делегата

private delegate void ReEntryDelegate(long CaseID, string MessageText);

Теперь метод будет содержать вызов веб-службы, подобный этому

WebServiceTest.Notification service = new WebServiceTest.Notification();
IAsyncResult handle;
ReEntryDelegate objAscReEntry = new ReEntryDelegate(service.ReEntryNotifications);
handle = objAscReEntry.BeginInvoke(CaseID, MessageText, null, null);
break;

И здесь значения переменных будут передаваться методом (CaseID, MessageText)

Надеюсь, вам это ясно

Всего наилучшего

0 голосов
/ 04 мая 2011

Если говорить о стороне сервера, если вы работаете на IIS и вам не нужна абсолютная информация в реальном времени, я рекомендую вам использовать журналы IIS.

Нет ничего быстрее, чем это былооптимизирован для производительности, начиная с IIS 1.0

Вы можете добавить свою собственную информацию в эти журналы ( HttpRequest.AppendToLog ), они имеют стандартный формат, есть API, если вы хотите делать пользовательские вещис ним (но вы все еще можете использовать анализатор текста, если хотите), и есть много бесплатных инструментов, например Microsoft Log Parser , которые могут передавать данные в базу данных SQL (среди прочих).

0 голосов
/ 26 апреля 2011

Первый подход выглядит хорошо. (И я рекомендую это.) Но у этого есть 2 недостатка:

  1. Запрос будет блокироваться до тех пор, пока задача не будет завершена (или не прервана по таймауту).
  2. Вам придется регистрировать свою задачу на каждой странице.

Второй подход выглядит неудобно и может привести к ошибкам. (Вы должны следить за ситуацией, когда ваша страница отображается быстрее, чем обрабатывается ваш запрос. Я не уверен, что произойдет, если ваш запрос не будет завершен, когда ваш объект страницы будет уничтожен, а GC продолжит выполнение finalize () ... но ничего хорошего, я полагаю. Вы можете избежать этого, ожидая IAsyncResult.IsCompleted после рендера, но это неудобно.)

Третий метод совершенно неправильный. Вы должны начать регистрацию на стороне сервера во время обработки запроса, который вы собираетесь регистрировать. Но вы все равно можете вызвать веб-сервис со стороны сервера. (Или выигрышный сервис).

Лично я хотел бы реализовать ведение журнала в BeginRequest, чтобы избежать дублирования кода, но вам нужен IsPostback ... Тем не менее, может быть обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...