31

サイトのパフォーマンスを低下させることなく、個人ごとにページビューをキャプチャする最良の方法は何ですか. stackoverflow があちこちにページビューを表示していることがわかります。ページをクリックするたびにデータベースへの挿入を行っていますか?

asp.net-mvcで、ユーザーごとのページビューを追跡する推奨される方法はありますか(私のサイトにはログイン画面があります)、人々がどのページにどのくらいの頻度でアクセスするかを確認できます

4

4 に答える 4

32

まず最初に..あなたが本当に気にかけているのが顧客が私のサイトをどのように使用しているかであるなら、あなたはおそらくグーグルアナリティクスまたは同様のサービスを調べたいと思うでしょう。

ただし、すばやくダーティなページビューレコードが必要で、ASP.Net MVC 3を使用している場合は、Chris Fulstowが述べたように、グローバルアクションフィルターとキャッシュを組み合わせて使用​​する必要があります。これが例です。

PageViewAttribute.cs 

    public class PageViewAttribute : ActionFilterAttribute
{
    private static readonly TimeSpan pageViewDumpToDatabaseTimeSpan = new TimeSpan(0, 0, 10);

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var calledMethod = string.Format("{0} -> {1}",
                                         filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
                                         filterContext.ActionDescriptor.ActionName);

        var cacheKey = string.Format("PV-{0}", calledMethod);

        var cachedResult = HttpRuntime.Cache[cacheKey];

        if(cachedResult == null)
        {
            HttpRuntime.Cache.Insert(cacheKey, new PageViewValue(), null, DateTime.Now.Add(pageViewDumpToDatabaseTimeSpan) , Cache.NoSlidingExpiration, CacheItemPriority.Default,
                                  onRemove);
        }
        else
        {
            var currentValue = (PageViewValue) cachedResult;

            currentValue.Value++;
        }
    }

    private static void onRemove(string key, object value, CacheItemRemovedReason reason)
    {
        if (!key.StartsWith("PV-"))
        {
            return;
        }

        // write out the value to the database
    }

    // Used to get around weird cache behavior with value types
    public class PageViewValue
    {
        public PageViewValue()
        {
            Value = 1;
        }

        public int Value { get; set; }
    }
}

そしてあなたのGlobal.asax.csで

public class MvcApplication : HttpApplication 
{
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new PageViewAttribute());
        }
}

ASP.Net MVC 3より前の場合のみ、すべてのアクションに同じ属性を手動で適用する必要があります。

[PageView]
public ActionResult CallOne()
{
}

[PageView]
public ActionResult CallTwo()
{
}
于 2011-06-16T17:35:03.667 に答える
19

最善の方法はおそらく、すべてのコントローラーのすべてのアクションへの要求をインターセプトし、現在のユーザーとページのデータベース内のカウンターをインクリメントするグローバル アクション フィルターです。データベースへの過度なアクセスを避けるために、処理しているトラフィックの量に応じて、これらの値をキャッシュし、数分ごとに無効にすることができます。

于 2011-05-21T02:49:09.253 に答える
5

オープン ソースの Piwik: http://piwik.org/を使用します。これは独自のサーバーにセットアップされています。_Layout ページの Javascript の 1 行は、ページがロードされた後に Piwik を呼び出し (最後に JS を配置)、ページのロード パフォーマンスにはまったく影響しません。

カウントだけでなく、ユーザーがどこからアクセスしているか、ブラウザ、画面解像度、インストールされているプラ​​グインに関する大量の情報を取得できます。さらに、コンバージョンを追跡し、同じツールを使用してマーケティング キャンペーンなどを追跡できます。

<ソープボックス>

これを MVC や Web アプリ全般に実装したほうがよい状況は考えられません。このようなものは単にあなたのウェブアプリに属しておらず、分離されるべきメタ懸念です. このアプローチにより、すべてのアプリ (そのうち 32 個: mvc 2/3、webforms、php...) の分析を統一された方法で追跡できるようになりました。

この目的で別のツールを本当に使用したくない場合は、IIS ログを利用して、そこから統計情報を取得することをお勧めします。繰り返しになりますが、実際の意思決定力を引き出すには、優れたアナライザーを配置する必要があります。Splunk をお勧めします: http://www.splunk.com/

</ソープボックス>

于 2011-06-17T18:12:11.840 に答える