asp.net-mvc - 如何将基准测试记录到 MVC Controller 中的 CSV 文件?

标签 asp.net-mvc logging asp.net-core dependency-injection benchmarking

我有一个 ASP.NET Core 应用程序,其中包含继承自 BaseController 的各种 Controller 。我需要使用秒表来实现一些基本的基准测试,它只会在操作方法的开头开始并在最后结束。我可以通过 appsettings.json 打开和关闭此功能。 Startup.cs 中有一个 ILogger 工厂:

public void Configure ( IApplicationBuilder app, IHostingEnvironment env,     ILoggerFactory loggerFactory ) {
        loggerFactory.AddConsole( Configuration.GetSection( "Logging" ) );
        loggerFactory.AddDebug();
        loggerFactory.AddFile(@"C:\Logs\Portal\portal-{Date}.txt"); 

我已将 ILogger 添加到我的 BaseController (如下),我希望这将通过 DI 提供。鉴于上述情况,我可以使用它来将基准测试结果记录到与启动文件不同的位置吗?我想要一个包含某些列的 .csv 文件,我可以用结果填充这些列。这可能吗?

public class BaseController : Controller {
    protected AppSettings AppSettings;
    protected IMapper Mapper;
    protected IPortalApiService PortalApiService;
    protected ILogger Logger;
    protected UserManager<ApplicationUser> UserManager;
    private static Stopwatch _stopWatch = new Stopwatch();
    private static long _seconds;

    public BaseController ( IMapper mapper,
                            IOptions<AppSettings> appSettings,
                            UserManager<ApplicationUser> userManager,
                            IPortalApiService PortalApiService,
                            ILogger logger) {
        Mapper = mapper;
        AppSettings = appSettings.Value;
        UserManager = userManager;
        PortalApiService = PortalApiService;
        Logger = logger;
    }

    public BaseController ( IMapper mapper,
                            IOptions<AppSettings> appSettings,
                            UserManager<ApplicationUser> userManager,
                            ILogger logger) {
        Mapper = mapper;
        AppSettings = appSettings.Value;
        UserManager = userManager;
        Logger = logger;
    }

    protected Task<ApplicationUser> GetCurrentUserAsync () {
        return UserManager.GetUserAsync( HttpContext.User );
    }

    public void StartBenchmark()
    {

        if (AppSettings.EnableBenchmarkLogging)
        {
            _stopWatch = Stopwatch.StartNew();
        }

    }

    public void EndBenchmark()
    {
        if (_stopWatch.IsRunning)
        {
            _stopWatch.Stop();
            _seconds = _stopWatch.ElapsedMilliseconds;
            //logging to do
        }
    }
}

最佳答案

not a good idea to use a BaseController in MVC 。有更好的方法来实现 crosscutting concerns 。在这种特殊情况下,您可以使用 global filter .

public class BenchmarkFilter : IActionFilter
{
    private readonly ILogger Logger;

    // DON'T DECLARE STATIC!! 
    private Stopwatch _stopWatch = new Stopwatch();

    public BenchmarkFilter(ILogger logger)
    {
        _logger = logger ?? 
            throw new ArgumentNullException(nameof(logger));
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        _stopWatch = Stopwatch.StartNew();
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (_stopWatch.IsRunning)
        {
            _stopWatch.Stop();
            var seconds = _stopWatch.ElapsedMilliseconds;
            //logging to do
        }
    }
}

这允许您通过构造函数通过 DI 注入(inject)服务,无需将这些参数添加到子类公共(public) BaseController 的每个 Controller ,从而将基准测试的关注点与完全 Controller 。

用法

Startup.cs 中,在 ConfigureServices 方法中添加过滤器。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(BenchmarkFilter)); // runs on every action method call
    });

    services.AddScoped<BenchmarkFilter>();
    // ....
}

关于asp.net-mvc - 如何将基准测试记录到 MVC Controller 中的 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48915332/

相关文章:

java - 我需要相当于 log4j v2 PropertyConfigurator.configure 的 log4j v4

pdf - 在Net Core中解析pdf

c# - 在 ASP.net 5 MVC 6 中,如何在不同的命名空间中使用相同的 Controller 名称

asp.net-core - 在 netstandard 中使用 Microsoft.AspNetCore.All 包

jquery - 从下拉列表助手中删除一个元素

java - 为什么我们需要两次在 tomcat logging.properties 中写入处理程序?

java - log4j 类别

c# - 在 ASP.NET 中缓存异步方法的结果

c# - 一个 View 中的两个相同模型 MVC

asp.net - 带有自定义 slugs 的 .NET MVC-4 路由