5

私は初心者で、C# 2005 で ASP .Net 2.0 を使用して Web サイトを開発しています。私のウェブサイトへの訪問者の数。Global.asax を使用して、この機能を追加するための基本情報を収集しました。system.web セクションの下に行 "" を追加して、Web.config を変更しました。

訪問者数を保持するためにテーブルを使用しています。しかし、タスクを完了する方法がわかりません。デフォルトの Global.asax ファイルには、Application_Start、Application_End、Application_Error、Session_Start、および Session_End というさまざまなセクションが含まれていました。Application_Start セクションでカウンターの現在の値を抽出し、グローバル変数に格納しようとしました。Session_Start のカウンターをインクリメントし、変更された値を Application_End のテーブルに書き込みます。

パブリック サブルーチン/関数を使用しようとしました。しかし、これらのサブルーチンはどこに配置すればよいのでしょうか? Global.asax 自体にサブルーチンを追加しようとしました。しかし、Global.asax に Data.SqlClient への参照を追加できず、機能を実装するには SqlConnection、SqlCommand、SqlDataReader などへの参照が必要なため、エラーが発生しています。サブルーチンごとに Class ファイルを追加する必要がありますか? 私を案内してください。

また、ウェブサイトに追跡機能を実装し、ウェブサイト訪問者の IP アドレス、使用したブラウザ、訪問日時、画面解像度などを保存したいと考えています。どうすればいいですか?

提案を待っています。

ラリット・クマール・バリク

4

4 に答える 4

6

単純な実装の場合、カスタム HttpModule を使用できます。アプリケーションへのリクエストごとに、次のことを行います。

  1. Request.Cookies にトラッキング Cookie が含まれているかどうかを確認します
  2. トラッキング Cookie が存在しない場合、これはおそらく新しい訪問者です (または、Cookie の有効期限が切れています -- 4 を参照してください)。
  3. 新しい訪問者の場合、訪問者の統計を記録してから、訪問者数を更新します
  4. 訪問者に返される応答に追跡 Cookie を追加します。この Cookie の有効期限をかなり長く設定して、Cookie の有効期限が切れたユーザーが戻ってきたときに多くの「誤検知」が発生しないようにする必要があります。

以下のスケルトン コードを次に示します ( StatsCounter.csとして保存します)。

using System;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Transactions;

namespace hitcounter
{
    public class StatsCounter : IHttpModule
    {
        // This is what we'll call our tracking cookie.
        // Alternatively, you could read this from your Web.config file:
        public const string TrackingCookieName = "__SITE__STATS";

        #region IHttpModule Members

        public void Dispose()
        { ;}

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
            context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders);
        }

        void context_PreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            HttpResponse response = app.Response;
            if (response.Cookies[TrackingCookieName] == null)
            {
                HttpCookie trackingCookie = new HttpCookie(TrackingCookieName);
                trackingCookie.Expires = DateTime.Now.AddYears(1);  // make this cookie last a while
                trackingCookie.HttpOnly = true;
                trackingCookie.Path = "/";
                trackingCookie.Values["VisitorCount"] = GetVisitorCount().ToString();
                trackingCookie.Values["LastVisit"] = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");

                response.Cookies.Add(trackingCookie);
            }
        }

        private long GetVisitorCount()
        {
            // Lookup visitor count and cache it, for improved performance.
            // Return Count (we're returning 0 here since this is just a stub):
            return 0;
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            HttpRequest request = app.Request;

            // Check for tracking cookie:
            if (request.Cookies[TrackingCookieName] != null)
            {
                // Returning visitor...
            }
            else
            {
                // New visitor - record stats:
                string userAgent = request.ServerVariables["HTTP_USER_AGENT"];
                string ipAddress = request.ServerVariables["HTTP_REMOTE_IP"];
                string time = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
                // ...
                // Log visitor stats to database

                TransactionOptions opts = new TransactionOptions();
                opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, opts))
                {
                    // Update visitor count.
                    // Invalidate cached visitor count.
                }
            }
        }

        #endregion
    }
}

Web.config ファイルに次の行を追加して、このモジュールを登録します。

<?xml version="1.0"?>
<configuration>
    ...
    <system.web>
        ...
        <httpModules>
          <add name="StatsCounter" type="<ApplicationAssembly>.StatsCounter" />
        </httpModules>
    </system.web>
</configuration>

(Web アプリケーション プロジェクトの名前に置き換えるか、Web サイト プロジェクトを使用している場合は削除します。

うまくいけば、実験を始めるにはこれで十分でしょう。ただし、他の人が指摘しているように、実際のサイトでは、これには Google (または他の) 分析ソリューションを使用する方がはるかに優れています。

于 2009-03-21T15:16:26.570 に答える
3

Google アナリティクスを使用します。車輪を再発明しようとしないでください。a) 車輪があなたのやりたいことをしないか、b) 車輪がどのように機能するかを見つけようとしているだけです。

于 2009-03-21T10:06:44.160 に答える
1

すでに利用可能なトラフィック分析を使用するという Gareth の提案には賛成しかできません。ウェブサイトのトラフィックに関するデータを Google に提供するという考えが気に入らない場合は、ログ ファイルをダウンロードして、利用可能な多くのウェブ サーバー ログ ファイル分析ツールの 1 つを使用して分析することもできます。

于 2009-03-21T11:44:21.447 に答える
1

Google アナリティクス スクリプトは、まさにあなたが必要としているものです。セッションのため、クローラーも開きます。

于 2009-03-21T12:11:05.873 に答える