1

Asp.net Web フォームを使用して、Google Analytics と同じように訪問者情報を追跡したいと考えています。もちろん、この目的で Google Analytic を使用できますが、Asp.net 3.5 と SQL Server 2008 で同じことを達成する方法を知りたいです。

ポストバックを除く各ページリクエストの IP、国、訪問者の URL リファラー、解像度を保存したい。私は毎日50k以上の訪問を期待しています。.

主な関心事は、現在のリクエストをブロックしないようにしたいということです。

つまり、一般に、データを db に保存すると発生し、現在のリクエストは特定の SP 呼び出しステートメントで停止し、SP または tsql ステートメントの実行が終了すると先に進みます。「挿入して忘れる」アプローチに従いたい。特定のイベントまたは関数にパラメーターを渡すと、バックグラウンドで挿入する必要があります。

以下の代替案を見つけました:
1. PageAsynchTask
2. BeginExecuteNonQuery
3. Jquery Post メソッドと Web サービス

私の問題を適切に言及したことを願っています。

どちらがより良いアプローチか誰か教えてもらえますか? また、リストされているものよりも他のアイデアやより良いアプローチがあれば教えてください。あなたの助けは本当に感謝されます.

4

4 に答える 4

1

サーバー側のバックグラウンド スレッドの問題は、すべてのリクエストが 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 非同期ポストバックをフィルタリングするためのソリューションが得られます。

これで問題の完全な解決策が得られますか?

于 2011-05-07T13:39:37.403 に答える
0

最初のアプローチは良さそうです。(そして私はそれをお勧めします。)しかし、それには2つの欠点があります:

  1. タスクが完了する (またはタイムアウトで中止される) まで、要求は引き続きブロックされます。
  2. すべてのページでタスクを登録する必要があります。

2 番目の方法は不便に見え、エラーが発生する可能性があります。(クエリの処理よりもページのレンダリングの方が速い状況に注意する必要があります。ページ オブジェクトが破棄されて GC が finalize() が続くときにクエリが完了していないとどうなるかわかりません...レンダリング後に IAsyncResult.IsCompleted を待つことで回避できますが、不便です。)

3番目の方法は明らかに間違っています。ログに記録しようとしているリクエストの処理中に、サーバー側でログを開始する必要があります。ただし、サーバー側から Web サービスを呼び出すことはできます。(またはウィンサービス)。

個人的には、コードの重複を避けるために BeginRequest にロギングを実装したいのですが、IsPostback が必要です... それでも回避策があるかもしれません。

于 2011-04-26T05:12:24.743 に答える
0

サーバー側について言えば、IIS を実行していて、絶対的なリアルタイム情報が必要ない場合は、IIS ログを使用することをお勧めします。

IIS 1.0 以降、パフォーマンスが最適化されているため、これより速いものはありません。

これらのログ ( HttpRequest.AppendToLog ) に独自の情報を追加できます。それらには標準の形式があり、カスタム処理を行う場合は API があります (ただし、必要に応じてテキスト パーサーを使用することもできます)。多くの無料ツール。たとえば、SQL データベース内のデータを転送できるMicrosoft Log Parserなどがあります。

于 2011-05-04T07:27:59.887 に答える
0

こんにちは、非同期リクエストを発行して、応答を待たずにできます。ここに私はいくつかの実装されたコードを持っています..

そのためには、データベース操作を行う Web サービスを作成する必要があります。または、それをイベント処理全体に使用することもできます。

サーバー側から、このように Web サービスを非同期的に呼び出す必要があります

プライベート デリゲートを宣言する

private delegate void ReEntryDelegate(long CaseID, string MessageText);

メソッドには、このような Web サービス呼び出しが含まれます。

WebServiceTest.Notification service = new WebServiceTest.Notification();
IAsyncResult handle;
ReEntryDelegate objAscReEntry = new ReEntryDelegate(service.ReEntryNotifications);
handle = objAscReEntry.BeginInvoke(CaseID, MessageText, null, null);
break;

そして、変数値はここでメソッドによって渡されます (CaseID,MessageText)

これがあなたに明らかであることを願っています

ではごきげんよう

于 2011-05-04T07:17:27.840 に答える