Проблемы с любым фоновым потоком на стороне сервера заключаются в том, что каждый запрос будет занимать два потока. Один для обслуживания запроса ASP.NET и один для ведения журнала того, что вы хотите зарегистрировать. Таким образом, у вас возникают проблемы с масштабируемостью из-за исчерпания потоков ASP.NET. И регистрировать каждый запрос в базе данных — это большое нет.
Лучше всего просто писать в файлы журналов, используя какую-нибудь высокопроизводительную библиотеку журналов. Библиотеки ведения журналов оптимизированы для многопоточного ведения журналов. Они не производят вызовы ввода/вывода при каждом вызове. Журналы хранятся в буфере памяти и периодически сбрасываются. Вы должны использовать EntLib или Log4net для регистрации.
Вы можете использовать HttpModule, который перехватывает каждый GET, POST, а затем внутри HttpModule вы можете проверить, является ли Request.Url aspx или нет. Затем вы можете прочитать Request.Headers["__ASYNCPOST"] и посмотреть, является ли оно «истинным», что означает, что это асинхронное обновление 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 из журнала.
Это дает вам полное решение проблемы?
person
oazabir
schedule
07.05.2011