2013-06-12 16 views
11

Tôi đang sử dụng ActionFilter để ghi lại tất cả các cuộc gọi hành động của dự án ASP.NET Web API của tôi. Phương thức OnActionExecuted cho biết rất nhiều về những gì đang xảy ra.Thời lượng nhật ký của một hành động ASP Web API

Tôi chỉ không thể tìm ra cách để tìm cách hiệu quả để đo thời gian thực hiện ...

Cảm ơn bạn đã trợ giúp!

+1

System.Diagnostics.Stopwatch? – Joe

+0

Ngoài ra, hãy kiểm tra [bài viết này] (https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/) cho cả API MVC và API Web. –

Trả lời

28

Something như thế này nên làm các trick ...

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); 
    } 
} 

Ở đây chúng ta lưu trữ một mới Stopwatch trong các thuộc tính yêu cầu và ngăn chặn nó khi yêu cầu đã hoàn thành.

+0

Cảm ơn bạn rất nhiều Dean! Đây là giải pháp hoàn hảo! – RooSoft

+0

Tại sao bạn lưu thể hiện trong yêu cầu? Tại sao bạn không biến nó thành một lĩnh vực riêng tư? – user49126

+3

@ user49126 Bộ lọc hành động được chia sẻ trên nhiều tác vụ và có thể có nhiều yêu cầu trong chuyến bay. Để loại bỏ các mối quan tâm đồng thời, an toàn nhất là lưu trữ cá thể trên yêu cầu. –

Các vấn đề liên quan