ASP.NET核心测量性能

时间:2018-02-16 08:42:57

标签: c# asp.net performance asp.net-core .net-core

我需要在ASP.NET Core应用程序中测量性能。更具体地说,单个HTTP请求完成所需的时间。

我现在这样做的方式是在我的代码周围使用Stopwatch个实例:

并将结果返回给stdout。

修改

正如您可以想象的那样,这种方法会在不同的应用程序部分进行传播,而将它隔离(例如单独的类)会更容易维护。

在ASP.NET Core应用程序中衡量性能的最佳方法是什么?

感谢。

1 个答案:

答案 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