Проблемы с любым фоновым потоком на стороне сервера - каждый запрос будет занимать два потока. Один для обслуживания запроса 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 из журнала.
Это дает вам полное решение проблемы?