我正在从事一个ASP.net Web 2项目,并希望对每个控制器操作的时间进行基准测试。我的想法是使用ActionFilterAttribute,并在包含所需时间的响应中添加一个http头。
主计长:
[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());
}
}
}当我运行这个程序时,即使控制器延迟了1s,执行时间也不到1秒。有没有人知道为什么会这样,或者是否有更好的方法对Web 2进行基准测试?
发布于 2015-05-02 07:30:07
在OnActionExecuting被击中之前,在流水线上执行了很多事情。此外,还有其他在OnActionExecuted之后执行的事情,其中最明显的是HttpActionResult。因此,最好是用HttpApplication.BeginRequest事件开始测量时间,用HttpApplication.EndRequest结束测量时间。
但是,我认为有更好的方法来测试web应用程序,而不是在服务器端记录经过的时间。费德勒有许多与基准测试相关的优秀特性:
发布于 2020-02-06 14:06:56
我遇到了同样的问题,发现这个博客上的解决方案起了作用:
public class StopwatchAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
actionContext.Request.Properties[actionContext.ActionDescriptor.ActionName] = Stopwatch.StartNew();
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
Stopwatch stopwatch = (Stopwatch)actionExecutedContext.Request.Properties[actionExecutedContext.ActionContext.ActionDescriptor.ActionName];
if (actionExecutedContext.Response != null && actionExecutedContext.Response.Content != null)
{
actionExecutedContext.Response.Content.Headers.TryAddWithoutValidation("Execution-Time", stopwatch.ElapsedMilliseconds.ToString());
}
}
}https://stackoverflow.com/questions/29998518
复制相似问题