3

我希望能够使用我的真实用户名数据填充 Application Insights 中的用户 ID 字段。这是一个内部应用程序,因此简单用户名字段的隐私问题没有实际意义。

据我所知,所有在线可用的解决方案都严格适用于 .NET Framework,而不是 .NET Core。

你可以在几个地方找到这个解决方案,包括 GitHub 上的一些旧 AI 文档。但是,当我运行它时,我在启动时收到一个错误,表明单例不能接受对作用域对象 IHttpContextAccessor 的依赖,这当然是合乎逻辑的。除非以前版本的 .NET Core 的 DI 允许(我在 2.2 上),否则我看不出这是如何工作的。

GitHub 上的这个问题有点说明问题,但在 AI 团队指出你必须使用单例后,它被关闭了。我尝试了 OP 和第一个响应中的内容的变体,当代码运行时,AI 上的 User Id 字段继续充满乱码数据。

有没有办法让 AI 中的 User Id 字段填充一些对来自 ASP.NET Core 应用程序的服务器请求有用的东西?

编辑

在看到下面我的代码应该可以正常工作的答案后,我回过头来意识到异常消息没有特别提到 IHttpContextAccessor:

System.InvalidOperationException: “不能从单例“Microsoft.Extensions.Options.IConfigureOptions`1 [Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration]”使用范围服务“Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer”。”

现在,我的代码看起来与下面@PeterBons 的答案几乎相同,所以从表面上看,这个异常没有任何意义。 TelemetryConfiguration没有事件出现在我的代码中。但后来我记得我在 Startup 中使用 Scrutor 懒惰地进行 DI 注册:

    services.Scan(scan => scan
        .FromAssembliesOf(typeof(Startup), typeof(MyDbContext))
        .AddClasses()
        .AsSelfWithInterfaces().WithScopedLifetime());

我认为问题是我需要将我的 ITelemetryInitializer 注册为 Singleton,并且此代码无意中将其取消或重新注册为作用域。所以我将最后两行更改为:

        .AddClasses(f => f.Where(t => t != typeof(RealUserAIProvider)))
        .AsSelfWithInterfaces().WithScopedLifetime());

它奏效了。而不是编辑我上面的错误,我会留下它。@PeterBons 在下面的回答仍然对其他人有所帮助,也许我对 Scrutor 的困惑也会对其他人有所帮助。

4

1 回答 1

6

您不必将 注册HttpContextAccessor为作用域依赖项。只需使用单例。

我们使用这个在生产中工作:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

结合这个初始化器:

public class SessionDetailsTelemetryEnrichment : TelemetryInitializerBase
{
    public SessionDetailsTelemetryEnrichment(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
    {

    }

    protected override void OnInitializeTelemetry(HttpContext platformContext, RequestTelemetry requestTelemetry, ITelemetry telemetry)
    {
        telemetry.Context.User.AuthenticatedUserId =
            platformContext.User?.Claims.FirstOrDefault(c => c.Type == "Username")?.Value ?? string.Empty;

    }
}
于 2019-07-11T05:53:33.050 回答