如何懒惰地使用ASP.NET Core日志记录? - c#

假设这样的情况:

[Route("api/test")]
public class TestController
{
    private readonly ILogger<TestController> logger;

    public TestController(ILogger<TestController> logger)
    {
        this.logger = logger;
    }

    [HttpPut]
    public void Put(Guid id, [FromBody]FooModel model)
    {
        logger.LogInformation($"Putting {id}");
        logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model));
        try
        {
            // Omitted: actual PUT operation.
        }
        catch (Exception ex)
        {
            logger.LogError("Exception {0}", ex);
        }
    }
}

public class FooModel 
{ 
    string Bar { get; set; } 
}

在这种情况下,LogInformation调用将触发一个string.Format调用,更糟糕的是,无论LogTrace如何,SerializeObject行都将触发一个LogLevel调用。这似乎很浪费。

在Logging API中是否有地方可以采用更懒惰的方法?我能想到的唯一解决方法是在模型上覆盖ToString以创建非常详细的表示,然后跳过使用JsonConvert.SerializeObject作为工具。

参考方案

ILogger接口提供了IsEnabled方法:

if (logger.IsEnabled(LogLevel.Information))
{
    logger.LogInformation($"Putting {id}");
}

if (logger.IsEnabled(LogLevel.Trace))
{
    logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model));
}

您将在GitHub上找到默认实现:https://github.com/aspnet/Extensions/blob/master/src/Logging/Logging/src/Logger.cs#L53

ASP.NET Core Singleton实例与瞬态实例的性能 - c#

在ASP.NET Core依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能?在我看来,对于Singleton实例,创建新对象和相关对象只需花费一次时间。对于Transient实例,此成本将针对每个服务请求重复。因此Singleton似乎更好。但是,在Singleton上使用Transient时,我们可以获得多…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

将Web服务迁移到.NET Core 2.0并返回json - c#

我已经将Web服务迁移到.NET Core 2.0,它可以正常工作,但是在以json字符串获取响应时遇到问题。api上的方法: [HttpGet] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(typeof(EntityNotFoundErrorResult), 404)]…

.NET Core 2从内存流下载Excel文件 - c#

我当时在.NET Core项目中工作,当时我应该从记录创建电子表格文件并下载它而不将其保存在服务器中。搜索上述标题并没有多大帮助,但给出了一些指示。另外,ASP.NET中使用的大多数方法在.NET Core中均不起作用。因此,我最终可以想出一个效果很好的解决方案。我将在下面的答案中与那些愿意像我一样进行搜索的人分享。 参考方案 首先,您需要安装EPPlus.…