2
Application Insightsに送信されるすべてのリクエストに対して、ユーザーの「client_id」クレームをプロパティとして添付したいと考えています。HttpContextとTelemetryInitializer
私が読んだところでは、ITelemetryInitializer
を実装する必要がありますが、 "client_id"を取得するためには、要求にはHttpContext
が必要です。
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;
}
}
}
}
は私がするたびにコンテキストを設定するアクションフィルタを作成することもできますが、これはひどい感じている:私の初期化子を参照してください
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);
}
}
は、私が何をしたい達成するためのより良い方法はありますか?
:
あなたのコードは次のようになります。 – davenewza
私は[ここに別の質問](http://stackoverflow.com/questions/38418682/webtelemetryinitializerbase-in-asp-net-core-mvc6)を尋ねました。 – davenewza
'WebTelemetryInitializerBase'の内部要素(2.2.0のソースをベースにしている)の場合、どのようにして派生できますか? – UserControl