HttpContext und TelemetryInitializer
Ich möchte den Anspruch "client_id" des Benutzers als Eigenschaft an jede an Application Insights gesendete Anforderung anhängen.
Nach dem, was ich gelesen habe, sollte ich implementierenITelemetryInitializer
aber ich brauche dasHttpContext
für die Anfrage, um "client_id" abzurufen. Siehe meinen Initialisierer:
public class ClaimTelemetryInitializer : ITelemetryInitializer
{
public HttpContext HttpContext { get; set; }
public void Initialize(ITelemetry telemetry)
{
this.AddTelemetryContextPropertFromClaims(telemetry, "client_id");
}
private void AddTelemetryContextPropertFromClaims(ITelemetry telemetry, string claimName)
{
if (HttpContext != null)
{
var requestTelemetry = telemetry as RequestTelemetry;
var claim = HttpContext.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase));
if (claim != null)
{
telemetry.Context.Properties[claimName] = claim.Value;
}
}
}
}
Ich könnte jedes Mal einen Aktionsfilter erstellen, um den Kontext festzulegen, aber das fühlt sich schrecklich an:
public class TrackClaimsAttribute : ActionFilterAttribute
{
public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var initialiser = TelemetryConfiguration.Active.TelemetryInitializers.OfType<ClaimTelemetryInitializer>().Single();
initialiser.HttpContext = context.HttpContext;
return base.OnActionExecutionAsync(context, next);
}
}
Gibt es einen besseren Weg, um das zu erreichen, was ich tun möchte?