首页 > 解决方案 > ASP.NET Core Application Insights 400 模型状态详细信息

问题描述

我正在尝试确定是否可以查看应用程序中发生 400 错误的详细信息。我认为知道没有价值的属性将允许更好地针对错误进行调查。例如,知道它是“名称”属性。

我在 Azure 中配置了应用洞察。它成功收集了 400 个 Web 应用程序做出的响应,但没有显示任何细节。

特别是在这种情况下,我在ActionFilterAttribute.

public override void OnActionExecuting(ActionExecutingContext context)
{
    if (!context.ModelState.IsValid)
    {
        context.Result = new BadRequestObjectResult(context.ModelState);
    }
}

响应的内容将包含 JSON 序列化ModelState值。

发生这种情况时,App Insights 会记录错误,指出请求失败并显示 400 状态代码。它不显示任何ModelState值。

我真正希望能够看到的关键信息不是模型的内容(可能包含敏感信息),而是集合细节的ModelState.Values集合,它基本上等同于以下属性:

ModelState.Values.Keys.Key
ModelState.Values.Keys.Errors()

无效属性将ModelState.Values.Keys.ValidationState设置为 false。

到目前为止,我的发现似乎表明我可以通过手动获取 aTelemetryClient并将另一个事件添加到 App Insights 来解决这个问题。

有没有办法可以将此详细信息附加到任何具有 400 异常的请求中?或者我是否需要添加另一个自定义调用并以TelemetryClient这种方式跟踪它?

如果是后者,我可以ActionFilterAttribute以某种方式将其添加到其中,以便全部处理吗?

有点感觉就像我不理解一些简单的东西,这一切都有意义。

标签: azure-application-insightsasp.net-core-2.1

解决方案


对于遇到这个问题的任何人,我们最终在 ASP.Net Core 中创建了一个结果过滤器,当生成 400 响应时,它会自动将模型状态记录为 json。它为我们提供了在发生错误时帮助解决错误所需的一切。

public sealed class Log400DetailsResultFilter : IResultFilter
{
    private readonly ILogger<Log400DetailsResultFilter> _log;

    public Log400DetailsResultFilter(ILogger<Log400DetailsResultFilter> log)
    {
        _log = log;
    }

    public void OnResultExecuted(ResultExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == (int)HttpStatusCode.BadRequest && context.ModelState.ErrorCount > 0)
        {
            var errors = new SerializableError(context.ModelState);
            _log.LogError($"Bad Request Model State Errors: {JsonConvert.SerializeObject(errors)}");
        }
    }

    public void OnResultExecuting(ResultExecutingContext context)
    {

    }
}

然后只需在启动中注册它,它将运行所有 400 个结果。

services.AddMvc(config =>
{
    config.Filters.Add<Log400DetailsResultFilter>();
});

在 Application Insights 中,您只需单击“端到端事务详细信息”刀片中的“查看所有遥测”按钮,它就会显示该事务的所有日志,包括模型状态的详细信息。

在此处输入图像描述

编辑 16/01/2020 过滤器注册代码在 .NET Core 3.0 中已更改。这是新的注册码:

services.AddControllers(config =>
{
    config.Filters.Add<ModelValidationResultFilter>();
});

编辑 2021年 1 月 1 日 您现在可以使用内置的 HTTP 日志记录实现类似的功能, 请参阅此处了解完整详细信息。


推荐阅读