1

私は最近この記事を見つけました:http: //coderjournal.com/2010/10/timing-the-execution-time-of-your-mvc-actions/

Controllerこれは、クラスに追加できるちょっとした属性を示しています。これにより、ストップウォッチが作成X-Runtimeされ、結果にヘッダーが貼り付けられます。

WCF Restサービスに似たものを追加しようとしていますが、今のところ理解できていません。Webサービスに同様の実装を行う方法について何か提案はありますか?

4

1 に答える 1

1

これは、アスペクトに最適な場所です。ポストシャープをチェックしてください。

次に、次のようなアスペクトを作成できます。

/// <summary>
/// Adds execution timing and automatic logging to the tagged method
/// </summary>
[Serializable]
public class MethodTimeAttribute : OnMethodBoundaryAspect
{
    private String MethodName { get; set; }
    private DateTime StartTime { get; set; }

    /// <summary>
    /// Method executed at build time. Initializes the aspect instance. After the execution
    /// of <see cref="CompileTimeInitialize"/>, the aspect is serialized as a managed 
    /// resource inside the transformed assembly, and deserialized at runtime.
    /// </summary>
    /// <param name="method">Method to which the current aspect instance 
    /// has been applied.</param>
    /// <param name="aspectInfo">Unused.</param>
    public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
    {
        MethodName = method.DeclaringType.FullName  "."  method.Name;
    }


    public override void OnEntry(MethodExecutionArgs args)
    {
        StartTime = DateTime.Now;
    }

    public override void OnExit(MethodExecutionArgs args)
    {
        Log.Debug(this, "Method {0} took {1} to execute", MethodName, DateTime.Now - StartTime);
    }
}

そして、あなたがしなければならないのは、このようにあなたのメソッドにタグを付けることです:

[MethodTime]
private void RunFor(TimeSpan runTime){
    // do stuff 
}

高度なポストシャープ機能にはライセンスが必要ですが、メソッド境界の側面などの単純な機能は無料です。

これはwcfサービスのネットワーク境界をテストしませんが、サービスの実装時間をテストします。

本当に必要な場合は、カスタム動作を作成し、それをWCFチェーンに挿入してタイミングをテストできますが、そのフェーズでボトルネックが発生する可能性はほとんどありません。より可能性が高いのは、大量のデータを送信しているために処理が遅いか、実装の処理が遅いことです。これらはすべて、サーバー側またはクライアント側で個別にテストできます。

于 2012-09-04T20:24:05.890 に答える