我需要在ASP.NET Core应用程序中测量性能。更具体地说,单个HTTP请求完成所需的时间。
我现在这样做的方式是在我的代码周围使用Stopwatch个实例:
并将结果返回给stdout。
修改
正如您可以想象的那样,这种方法会在不同的应用程序部分进行传播,而将它隔离(例如单独的类)会更容易维护。
在ASP.NET Core应用程序中衡量性能的最佳方法是什么?
感谢。
答案 0 :(得分:1)
您可以使用asp.net filter pipeline实现ActionLogFilter。
public class ActionLogFilter : IActionFilter
{
// some dependencies
private DateTime traceStart;
private readonly Stopwatch stopwatch;
public ActionLogFilter(// some dependencies)
{
this.stopwatch = new Stopwatch();
}
// here the action starts executing
public void OnActionExecuting(ActionExecutingContext context)
{
this.traceStart = DateTime.UtcNow;
this.stopwatch.Start();
}
// here the action is executed
public void OnActionExecuted(ActionExecutedContext context)
{
this.stopwatch.Stop();
var traceEnd = this.traceStart
.AddMilliseconds(this.stopwatch.ElapsedMilliseconds);
// do something, persist it somewhere if necessary
}
}
现在你可以继续你的启动类并添加注册过滤器
public void ConfigureServices(IServiceCollection services)
{
.....
services.AddMvc(options => options.Filters.Add(typeof(ActionLogFilter));
.....
}
如果您需要该操作日志过滤器中的更多信息,例如关于请求控制器,路径等的信息,您可以使用您喜欢的IoC-Container注册IHttpContextAccesor。对于原生DI,请执行以下操作
public void ConfigureServices(IServiceCollection services)
{
.....
services.AddScoped<IHttpContextAccessor, HttpContextAccesor>();
.....
}
然后,您可以将依赖项注入过滤器并通过property of the IHttpContextAccessor实例访问HttpContext。
如果您希望该过滤器运行异步,则可以实现IAsyncActionFilter。