25

MVC 4アプリの一部のユーザーは、散発的な速度低下を経験しています。おそらく、すべてのユーザーが問題が発生するたびにその問題を報告するわけではありません。

私の考えは、各コントローラーアクションに費やされた時間を測定し、規定の時間を超えるアクション呼び出しの詳細をログに記録して、さらなる分析を容易にすることです(サーバー/コードの問題を除外または除外するため)。

各アクションにインストルメンテーションコードを追加することを回避できるように、そのような測定を実行するためにフックする便利な方法はありますか?私は現在このプロジェクトにIOCを使用しておらず、この問題を解決するためだけにIOCを導入することを躊躇します。

この種の問題に取り組むためのより良い方法はありますか?

4

4 に答える 4

42

グローバルアクションフィルターを作成できますか?このようなもの:

public class PerformanceTestFilter : IActionFilter
{
    private Stopwatch stopWatch = new Stopwatch();

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        stopWatch.Reset();
        stopWatch.Start();
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        stopWatch.Stop();
        var executionTime = stopWatch.ElapsedMilliseconds;
        // Do something with the executionTime
    }
}

GlobalFilters次に、それを`Application_Start()'でコレクションに追加します。

GlobalFilters.Filters.Add(new PerformanceTestFilter());

テスト対象のコントローラーの詳細は、filterContextパラメーターから取得できます。

アップデート

コレクションにフィルターを直接追加すると、GlobalFiltersすべてのアクションに対してフィルターの単一のインスタンスが作成されます。もちろん、これは同時リクエストのタイミングには機能しません。アクションごとに新しいインスタンスを作成するには、フィルタープロバイダーを作成します。

public class PerformanceTestFilterProvider : IFilterProvider
{
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        return new[] {new Filter(new PerformanceTestFilter(), FilterScope.Global, 0)};
    }
}

次に、フィルターを直接追加する代わりに、フィルタープロバイダーを次の場所に追加しますApplication_Start()

FilterProviders.Providers.Add(new PerformanceTestFilterProvider());
于 2012-07-05T22:12:36.997 に答える
4

私は通常、この単純なコードをレイアウトビューの下部に追加します。

<!-- Page generated in @((DateTime.UtcNow - HttpContext.Current.Timestamp.ToUniversalTime()).TotalSeconds.ToString("F4")) s -->

次のようなものを出力します。

<!-- Page generated in 0.4399 s -->

HttpContextこれは、が作成されたときに測定を開始し(ドキュメントによると)、出力に書き込む直前に停止するため、かなり正確である必要があります。

すべてのユースケースで機能するとは限りませんが(子アクションを測定したい場合、またはMVCアクション以外の時間を無視したい場合など)、ビューに貼り付けるのは簡単です。

より高度な診断のために、私はGlimpseを使用していました。

于 2017-01-19T17:11:40.123 に答える
1

ASP.NET4.5ページインストルメンテーションを試す

ページレンダリングを計測します。アプリの時間はコントローラーで費やされる可能性がありますが、ビューレンダリングで費やされる時間はたくさんあります。特に、パーシャルとhtmlヘルパーがたくさんある場合。

于 2014-07-26T21:49:59.987 に答える
0

更新-StopwatchNuGetパッケージをInstall-PackageStopWatchでインストールします。ASP.NETMVCアプリのプロファイルと時刻をAzureまで参照してください。

グローバルアクションフィルタータイマーを備えたASP.NETMVC4での非同期メソッドの使用に関するチュートリアルを参照してください。ELMAHを使用してデータをログに記録できます。私のサンプル私のサンプルhttp://msdn.microsoft.com/en-us/library/gg416513(v=vs.98)にも同じタイミングフィルターがあり、より単純ですが、かみそり以前のものです。

タイミングを有効にするには、ストップウォッチ属性を探します。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new UseStopwatchAttribute());
    }
}
于 2012-07-06T16:59:12.947 に答える