2016-07-01 9 views
0

asp.net mvc5에서 거의 모든 작업의 ​​실행 시간을 기록하고 싶지만 기본적으로 아래 코드로이 작업을 수행하는 것이 올바른 방법입니까? 아니면 프로젝트가 매우 느립니다. 어떠한 제안?사용자 지정 작업 필터를 사용하여 asp.net mvc5에서 모든 작업 실행 시간을 계산하는 방법은 무엇입니까?

Stopwatch sw = new Stopwatch(); 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     sw.Start(); 
     base.OnActionExecuting(filterContext); 
    } 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     sw.Stop(); 
     float f = sw.ElapsedMilliseconds; 
     base.OnActionExecuted(filterContext); 
    } 
+1

이 나에게 좋아 보이는에서 값을 캐스팅 할 수 있습니다, 그것은 확실히 당신의 코드를 느리게하지 않습니다. 당신은 concurency 문제가있을 수 있습니다. 각 요청에 대해 별도의 필터 인스턴스가 만들어 졌는지 확신 할 수 없습니다. 그렇지 않은 경우 여러 요청이있을 경우 잘못된 측정 값을 가질 수 있습니다. 동시성 문제를 피하기 위해 사전이나 컨텍스트 자체에 타이밍을 저장해야 할 수도 있습니다. – Jim

+0

@Jim 동시성 문제를 사전에 예방할 수 있도록 시간을 주셔서 감사합니다. – mayk

+0

요청 당 사용되는 것 같지만 예외가 발생하면 어떻게됩니까? – Legends

답변

2

아마도 타이밍에 적절하게 범위가 지정된 위치에 요청을 저장할 수 있습니다.

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    filterContext.HttpContext.Items["timer"] = Stopwatch.StartNew(); 
    base.OnActionExecuting(filterContext); 
} 

당신이 성가신 사전을 사용하지 않는 방법, 그리고 타이머는 per request 기준입니다.

그런 다음 OnActionExecuted

 var sw = filterContext.HttpContext.Items["timer"] as Stopwatch; 
     sw.ElapsedMilliseconds...