2013-06-12 7 views
11

Я использую ActionFilter для регистрации всех вызовов действий моего проекта ASP.NET Web API. Метод OnActionExecuted много рассказывает о том, что происходит.Длительность действия ASP Web API

Я просто не могу понять, как найти эффективный способ измерения времени выполнения ...

Спасибо за любую помощь!

+1

System.Diagnostics.Stopwatch? – Joe

+0

Также проверьте [эту статью] (https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/) для API MVC и веб-API. –

ответ

28

Что-то вроде этого следует сделать трюк ...

public class StopwatchAttribute : ActionFilterAttribute 
{ 
    private const string StopwatchKey = "StopwatchFilter.Value"; 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     base.OnActionExecuting(actionContext); 

     actionContext.Request.Properties[StopwatchKey] = Stopwatch.StartNew(); 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     base.OnActionExecuted(actionExecutedContext); 

     Stopwatch stopwatch = (Stopwatch)actionExecutedContext.Request.Properties[StopwatchKey]; 
     // TODO something useful with stopwatch.Elapsed 
     Trace.WriteLine("Elapsed = " + stopwatch.Elapsed); 
    } 
} 

Здесь мы храним в свойствах запроса нового Stopwatch и остановить его, когда запрос завершен.

+0

Большое спасибо Дину! Это идеальное решение! – RooSoft

+0

Зачем сохранять экземпляр в запросе? Почему бы вам не сделать это частным полем? – user49126

+3

@ user49126 Фильтры действий распределяются между несколькими действиями, и может потребоваться несколько запросов в полете. Чтобы устранить проблемы параллелизма, безопаснее хранить экземпляр запроса. –