服务器端任何后台线程的问题是每个请求都占用两个线程。一个用于提供ASP.NET请求,另一个用于记录要记录的内容。所以,最终由于ASP.NET线程耗尽而导致可伸缩性问题。并且在数据库中记录每一个请求是一件很大的事情。
最好的办法就是使用一些高性能日志库来写入日志文件。日志记录库针对多线程日志进行了高度优化。他们不会在每个呼叫中产生I/O呼叫。日志存储在内存缓冲区中并定期刷新。您应该使用EntLib或Log4net进行日志记录。
您可以使用拦截每个GET,POST,然后在HttpModule内部的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->国家数据库来完成这项工作。我以前用过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(我还没有证明代码),您可以通过使用Request.Cookies时读取来自HTTP模块屏幕尺寸,然后在日志文件中记录它。
因此,这为您提供了登录IP,屏幕大小,从IP查找国家以及从日志记录过滤UpdatePanel异步回发的解决方案。
这是否为您提供了完整的解决方案?
我一直在使用Entlib(DAAB +异常处理+日志记录)为它和IP到国家,我将使用[this](http://www.ipinfodb.com)。我怀疑你说的关于将信息存储在数据库中的情况,所以如果我想在他的仪表板中向管理员显示不同的访问者详细信息,会有什么样的选择?我认为在日志文件中保存细节是不可能的。感谢您的解决方案片段,我将与HTTP模块一起使用,因为我将获得有关每个请求的必需信息,并且模块也可以用于其他项目。非常感谢您的帮助 – 2011-05-08 16:56:43
您应该将原始日志存储在日志文件中。然后,您可以创建一些处理原始日志的Windows服务或控制台应用程序,然后执行IP - >国家/地区映射,然后将摘要信息存储在数据库中。我建议不要将每次访问都存储在数据库中。最好在数据库中存储一些每日摘要或国家明智的摘要,并从管理仪表板显示。 – oazabir 2011-05-10 19:54:02
如果这有帮助,请投我的答案。 – oazabir 2011-05-10 19:54:31