C# 将自定义用户名设置为初始化器应用程序细节

C# 将自定义用户名设置为初始化器应用程序细节,c#,azure,azure-application-insights,C#,Azure,Azure Application Insights,我希望在Application Insights中添加一个登录的用户名,以在默认情况下替换cookie。我发现这个有点像这样 public class RealUserIDTelemetryInitializer:ITelemetryInitializer { public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry) { // Replace this

我希望在Application Insights中添加一个登录的用户名,以在默认情况下替换cookie。我发现这个有点像这样

public class RealUserIDTelemetryInitializer:ITelemetryInitializer
{
     public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry)
       {
       // Replace this with your custom logic
       if (DateTime.Now.Ticks % 2 > 0)
       {
            telemetry.Context.User.Id = "Ron Weasley";
       }
       else
       {
            telemetry.Context.User.Id = "Hermione Granger";
       }
     }
}

我的问题是,我该如何将数据传递到这个系统中?我的Api上有一个返回一些信息的登录方法,但调用此初始值设定项是我感到困惑的事情。

我们曾经遇到过同样的问题,虽然不是针对用户id,而是针对操作id。但同样的原则可以应用于这里。我们使用了一个
Func
,为初始值设定项提供数据(请参阅初始值设定项的完整代码和用法)


正如您在本例中所看到的,数据是使用当前线程上的数据提供的,但在您的情况下,我认为可以更轻松地访问用户名,因此您可能会注入另一个Func。

有趣的是,您是否能够获得唯一的会话来执行此操作,或者每次创建LoggerFactory()时都会记录此操作被击中?我不确定我是否理解你的问题,但基本上每次AI想要发送遥测数据时,它都会首先调用func。因此,这是CreateLoggerFactory中的一次性设置。(在启动api时调用CreateLoggerFactory一次)。我们创建了一些设置线程上数据的程序。不同的线程使它成为一个挑战,因为初始值设定者不知道任何上下文。我们用这种方式解决了这个挑战,它就像一个符咒一样工作,每个请求都有它自己的唯一id,我们可以使用它关联所有AI事件。好的,我将对此进行研究,看看它是如何工作的。我可能会在几天后给你打勾。玩得开心,如果你卡住了,告诉我们。
public class RealUserIDTelemetryInitializer:ITelemetryInitializer
{
     private readonly Func<string> usernameProvider; 

     public RealUserIDTelemetryInitializer(Func<string> usernameProvider)
     {
         this.usernameProvider = usernameProvider;
     }
     public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry)
     {
           telemetry.Context.User.Id = usernameProvider.Invoke();
     }
}
configuration.TelemetryInitializers.Add(new RealUserIDTelemetryInitializer(() =>
            CallContext.LogicalGetData(UserId)?.ToString()));