サーバー側のバックグラウンド スレッドの問題は、すべてのリクエストが 2 つのスレッドを占有することです。1 つは ASP.NET 要求を処理するためのもので、もう 1 つはログに記録したいものをログに記録するためのものです。そのため、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 に依存する必要があります。クライアント側で画面のサイズを検出し、Cookie に保存する JavaScript を各ページで使用します。
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 非同期ポストバックをフィルタリングするためのソリューションが得られます。
これで問題の完全な解決策が得られますか?