azure-application-insights - 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
以某种方式将其添加到其中,以便全部处理吗?
有点感觉就像我不理解一些简单的东西,这一切都有意义。
解决方案
对于遇到这个问题的任何人,我们最终在 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 日志记录实现类似的功能, 请参阅此处了解完整详细信息。
推荐阅读
- node.js - zlib:zlib 绑定关闭
- flutter - 当我在 GitHub 上推送项目时,iOS 文件夹在颤振存储库中显示为空
- python - Matplotlib:如何使用“插入轴”将 line2D 对象复制到缩放区域
- python - 如何对图像进行去噪
- javascript - 如何在reactjs中将功能和按钮绑定在一起
- jquery - 选中复选框时如何更改表格行内输入文本的背景颜色
- java - 无法在 appium 的 twitter LoginPage 上找到元素
- ajax - 如何在特定页面上为用户添加权限
- xamarin - 适用于 iOS 的 Xamarin 表单“无法 AOT 程序集”
- javascript - .net core 2.2 和 3.0 中的不同帖子结构