2015-05-02 40 views
1

我正在开发一个ASP.net Web API 2项目,并希望基准每个控制器操作的时间。我的想法是使用ActionFilterAttribute并在包含所花费时间的响应中添加一个http标头。基准测试ASP.net Web API操作

控制器:

[Timing] 
public class MyController : ApiController 
{ 
    [Route("get")] 
    public IHttpActionResult Get() { 
     System.Threading.Thread.Sleep(1000); 
     return Ok(); 
    } 
} 

ActionFilterAttribute:

public class TimingAttribute : ActionFilterAttribute 
{ 
    private System.Diagnostics.Stopwatch timer; 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     timer = System.Diagnostics.Stopwatch.StartNew(); 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     timer.Stop(); 
     if (actionExecutedContext.Response != null && actionExecutedContext.Response.Content !=null) 
     { 
       actionExecutedContext.Response.Content.Headers.TryAddWithoutValidation("Execution-time", timer.ElapsedMilliseconds.ToString()); 
     } 
    } 
} 

当我跑,我得到小于1秒的执行时间,即使我有一个控制器中的1秒的延迟。有谁知道为什么会出现这种情况,或者有更好的方法来测试Web API 2吗?

回答

0

在OnActionExecuting命中之前,沿着管道执行了很多事情。另外,在OnActionExecuted之后还有其他的东西被执行,最明显的就是HttpActionResult。因此最好使用HttpApplication.BeginRequest事件启动测量时间,HttpApplication.EndRequest结束测量时间。

但是,我认为有更好的方法来测试一个Web应用程序比在服务器端的日志流逝时间。 Fiddler有很多相关的基准不错的功能:

  • 您可以通过使用过滤器捕获感兴趣的http流量。
  • 统计信息视图,您可以在其中查看所选会话的大量统计信息。
  • 时间线视图向您显示关于所选会话所花时间的很好图表。
  • 您可以将会话保存到会话归档中,这是一个包含关于会话的所有信息(包括带时序信息的xml文件)的zip文件,您可以稍后再分析以构建自己的报告。