首页 > 解决方案 > 从自定义的错误请求响应内部记录

问题描述

我正在使用下面的代码捕获模型验证错误,并从 CustomProblemDetails 对象输出自定义 400 响应,效果很好。我的问题是,我想从 CustomProblemDetails 对象中登录,但看不到如何使用 DI。我已经通过了上下文,这使我可以访问服务,但这是要走的路吗?如果是这样,我只能访问 ILoggerFactory 如何使用 ILoggerFactory 登录?

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.InvalidModelStateResponseFactory = context =>
        {
            var problemDetails = new CustomProblemDetails(context)
            {
                Type = "https://contoso.com/probs/modelvalidation",
                Title = "One or more model validation errors occurred.",
                Status = StatusCodes.Status400BadRequest,
                Detail = "See the errors property for details.",
                Instance = context.HttpContext.Request.Path
            };

            return new BadRequestObjectResult(problemDetails)
            {
                ContentTypes = { "application/problem+json" }
            };
        };
    });

标签: asp.net-coreasp.net-core-webapi

解决方案


对于登录InvalidModelStateResponseFactory,您可以尝试以下代码:

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).ConfigureApiBehaviorOptions(options =>
{
    options.InvalidModelStateResponseFactory = context =>
    {
        var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
        var logger = loggerFactory.CreateLogger("Logger From Invalid Model");
        var problemDetails = new CustomProblemDetails(context)
        {
            Type = "https://contoso.com/probs/modelvalidation",
            Title = "One or more model validation errors occurred.",
            Status = StatusCodes.Status400BadRequest,
            Detail = "See the errors property for details.",
            Instance = context.HttpContext.Request.Path
        };
        logger.LogError(JsonConvert.SerializeObject(problemDetails));
        return new BadRequestObjectResult(problemDetails)
        {
            ContentTypes = { "application/problem+json" }
        };
    };
});

推荐阅读