Application Insights TelemetryInitializer 和 HttpContext.User
Application Insights TelemetryInitializer and HttpContext.User
在 WebApi2 项目中,我有自定义声明,我想为每个请求将其作为自定义 属性 发送。
我实现了 TelemetryInitializer,但 HttpContext 中的 User 始终为 null。
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");
}
实现此目标的正确方法是什么?
根据你的描述,我检查了Visual Studio Application Insights SDK for .NET Web Applications and found WebTelemetryInitializerBase.cs有一个抽象方法OnInitializeTelemetry
如下:
protected abstract void OnInitializeTelemetry(
HttpContext platformContext,
RequestTelemetry requestTelemetry,
ITelemetry telemetry);
您可以继承 WebTelemetryInitializerBase
并覆盖提供 HttpContext
参数的 OnInitializeTelemetry
方法,然后您可以检索您的声明。
更新:
您还可以继承其他继承 WebTelemetryInitializerBase
.
的 TelemetryInitializers
例如,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;
}
}
}
此外,您还可以通过here搜索其他TelemetryInitializers。
在 WebApi2 项目中,我有自定义声明,我想为每个请求将其作为自定义 属性 发送。
我实现了 TelemetryInitializer,但 HttpContext 中的 User 始终为 null。
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");
}
实现此目标的正确方法是什么?
根据你的描述,我检查了Visual Studio Application Insights SDK for .NET Web Applications and found WebTelemetryInitializerBase.cs有一个抽象方法OnInitializeTelemetry
如下:
protected abstract void OnInitializeTelemetry(
HttpContext platformContext,
RequestTelemetry requestTelemetry,
ITelemetry telemetry);
您可以继承 WebTelemetryInitializerBase
并覆盖提供 HttpContext
参数的 OnInitializeTelemetry
方法,然后您可以检索您的声明。
更新:
您还可以继承其他继承 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;
}
}
}
此外,您还可以通过here搜索其他TelemetryInitializers。