使用Web Api 2.x将{{State}}的ModelState错误记录到应用程序见解中,以了解每个错误的Http请求

问题描述

我知道我可以创建一个ActionFilter,从当前的ActionContext中获取ModelState。 我可以使用TelemetryClient或ILogger(如果它适用于旧的Web API),并在添加到应用数据洞察属性中进行手动错误。但是,然后我将有两次相同的400错误http请求。从过滤器中被天青和矿山拦截...

在必须访问ModelState的地方,我必须实现与Telemtry相关的接口,以便可以直接参与整个Telemtry跟踪过程?

ITelemetryInitializer ITelemetryProcessor 均无权访问ModelState!

那正确的方法是什么?

解决方法

除了在全局启动中注册Global ActionFilter或ResultFilter来通过TelemetryClient捕获ModelState和Track Request之外,您没有太多选择(请记住将其声明为静态以避免TelemetryClient的多个实例)。要消除内置请求的重复请求日志记录,您可以禁用ApplicationInsights.config中的RequestTrackingTelemetryModule,如下所示(对此进行了注释)。当然,您现在需要将所有请求记录到新的操作筛选器中,除此之外,由于您现在禁用了内置请求,因此还有模型验证错误。

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
  <TelemetryModules>
    <Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule,Microsoft.AI.WindowsServer" />
    <!--<Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule,Microsoft.AI.Web" />-->
  </TelemetryModules>
  <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel,Microsoft.AI.ServerTelemetryChannel" />
  <TelemetryInitializers>
    <Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer,Microsoft.AI.Web" />
    <Add Type="Microsoft.ApplicationInsights.Web.OperationIdTelemetryInitializer,Microsoft.AI.Web" />
  </TelemetryInitializers>
  <InstrumentationKey>00001111-2222-3333-4444-555566667777</InstrumentationKey>
</ApplicationInsights>