服务器端任何后台线程的问题是每个请求都将占用两个线程。一种用于服务 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->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 中(我没有显示该代码)后,您可以使用 Request.Cookies 从 HttpModule 读取屏幕尺寸,然后将其记录到日志文件中。
因此,这为您提供了记录 IP、屏幕大小、从 IP 查找国家/地区以及从日志中过滤 UpdatePanel 异步回发的解决方案。
这是否为您提供了问题的完整解决方案?