Cha*_*bub 0 asp.net-web-api2 azure-application-insights
在 WebApi2 项目中,我有自定义 Claim,我想将它作为每个请求的自定义属性发送。
我实现了 TelemetryInitializer 但 HttpContext 中的 User 始终为空。
public class MyTelemetryInitializer : ITelemetryInitializer
{
var requestTelemetry = telemetry as RequestTelemetry;
if (requestTelemetry == null) return;
var user= HttpContext.Current.User;
// values from header are wokring
requestTelemetry.Context.Properties["abc"] = HttpContext.Current.Request.Headers.Get("abc");
}
Run Code Online (Sandbox Code Playgroud)
实现这一目标的正确方法是什么?
根据你的描述,我查看了Visual Studio Application Insights SDK for .NET Web Applications,发现WebTelemetryInitializerBase.cs有个抽象方法OnInitializeTelemetry如下:
protected abstract void OnInitializeTelemetry(
HttpContext platformContext,
RequestTelemetry requestTelemetry,
ITelemetry telemetry);
Run Code Online (Sandbox Code Playgroud)
您可以继承WebTelemetryInitializerBase并覆盖OnInitializeTelemetry提供HttpContext参数的方法,您可以检索您的声明。
更新:
您还可以继承其他的 TelemetryInitializers 继承WebTelemetryInitializerBase.
例如,UserTelemetryInitializer,你可以定义你的自定义 TelemetryInitializer 如下:
public class CustomTelemetryInitializer : UserTelemetryInitializer //WebTelemetryInitializerBase
{
protected override void OnInitializeTelemetry(
HttpContext platformContext,
RequestTelemetry rootRequestTelemetry,
ITelemetry telemetry)
{
var claim = ((ClaimsIdentity)platformContext.User.Identity).Claims.FirstOrDefault(x => x.Type.Equals("<custom-claim-name>", StringComparison.InvariantCultureIgnoreCase)); ;
if (claim != null)
{
telemetry.Context.Properties["<<custom-claim-name>>"] = claim.Value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您还可以通过此处搜索其他 TelemetryInitializer 。
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |