我希望能够使用我的真实用户名数据填充 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 的困惑也会对其他人有所帮助。