web-dev-qa-db-ja.com

asp.net-mvcでユーザーごとのページビューをキャプチャするための最良の方法は何ですか

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

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

31
leora

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

18
Chris Fulstow

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

ただし、すばやくダーティなページビューレコードが必要で、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以前のMVC3[〜#〜]のみ[〜#〜]の場合、すべてに同じ属性を手動で適用する必要がありますあなたの行動の。

[PageView]
public ActionResult CallOne()
{
}

[PageView]
public ActionResult CallTwo()
{
}
32

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

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

<soapbox>

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

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

</ soapbox>

5