2016-07-16 20 views
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); 
    } 
} 

は、私が何をしたい達成するためのより良い方法はありますか?

答えて

4

あなたはHttpContextを提供するWebTelemetryInitializerBaseを実装する必要があります。残念ながら、これはASP.NETコア/ MVC6との互換性は思えない

public class ClaimTelemetryInitializer : WebTelemetryInitializerBase 
{ 
    protected override void OnInitializeTelemetry(
      HttpContext platformContext, 
      RequestTelemetry rootRequestTelemetry, 
      ITelemetry telemetry) { 

      var claim = HttpContext.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase)); 

      if (claim != null) 
      { 
       telemetry.Context.Properties[claimName] = claim.Value; 
      } 
    } 
} 
+0


あなたのコードは次のようになります。 – davenewza

+0

私は[ここに別の質問](http://stackoverflow.com/questions/38418682/webtelemetryinitializerbase-in-asp-net-core-mvc6)を尋ねました。 – davenewza

+1

'WebTelemetryInitializerBase'の内部要素(2.2.0のソースをベースにしている)の場合、どのようにして派生できますか? – UserControl