gpt4 book ai didi

c# - 在 Application Insight .Net Core 2.1 中使用自定义属性记录用户名和 IP

转载 作者:行者123 更新时间:2023-11-30 18:13:20 25 4
gpt4 key购买 nike

我们正在 .Net Core 2.0 上运行 Intranet 应用程序。应用程序洞察力非常有助于捕获异常。因此,当用户向我们寻求支持时,我们希望找到他的请求导致应用程序洞察出现问题。我像这样添加了一个 ClientIpHeaderTelemetryInitializer:

public class CustomTelemetry : ClientIpHeaderTelemetryInitializer
{
private readonly IHttpContextAccessor _httpContextAccessor ;

public CustomTelemetry(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}

/// <summary>
/// Implements initialization logic.
/// </summary>
/// <param name="platformContext">Http context.</param>
/// <param name="requestTelemetry">Request telemetry object associated with the current request.</param>
/// <param name="telemetry">Telemetry item to initialize.</param>
protected override void OnInitializeTelemetry(HttpContext platformContext, RequestTelemetry requestTelemetry, ITelemetry telemetry)
{

requestTelemetry.Properties.Add("UserName", _httpContextAccessor.HttpContext.User.Identity.Name);
if (string.IsNullOrEmpty(telemetry.Context.Location.Ip))
{
LocationContext location = requestTelemetry.Context.Location;
telemetry.Context.Location.Ip = location.Ip;
requestTelemetry.Properties.Add("InternalIP", location.Ip);
}
}
}

Initalizer 在启动时注册如下:

services.AddSingleton<ITelemetryInitializer, CustomTelemetry>();  

当我查看请求时,自定义数据仍然是空的。 Application Insight Custom Data
我是不是注册错了?我在 Application Insights 的集成测试中找到了添加服务的完全相同的行(尽管被注释掉了……)
有没有人知道哪里出了问题?

最佳答案

我终于让它为我的目的工作了。

public class CustomTelemetry : ClientIpHeaderTelemetryInitializer
{
private readonly IHttpContextAccessor _httpContextAccessor ;

public CustomTelemetry(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}

/// <summary>
/// Implements initialization logic.
/// </summary>
/// <param name="platformContext">Http context.</param>
/// <param name="requestTelemetry">Request telemetry object associated with the current request.</param>
/// <param name="telemetry">Telemetry item to initialize.</param>
protected override void OnInitializeTelemetry(HttpContext platformContext, RequestTelemetry requestTelemetry, ITelemetry telemetry)
{
var userName = _httpContextAccessor.HttpContext?.User?.Identity?.Name; // Only set when request failed...
var ip = _httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
if (ip != null) telemetry.Context.GlobalProperties.TryAdd("InternalIP", ip);
if(userName != null) requestTelemetry.Properties.Add("UserName", userName);
}
}

(注意:ClientIpHeaderTelemetryInitializer 是 AppInsights 的一部分)

这里重要的是从 HttpContext 获取所有内容,检查它是否为 null 并添加自定义属性。否则,IP 的内置属性可能会被覆盖。 Migrosoft GDPR Blogpost

Startup中将其添加到ConfigureService

services.AddSingleton<ITelemetryInitializer, CustomTelemetry>();

确保事先添加 ContextAccessor 以便它可以被注入(inject):

services.AddHttpContextAccessor();

在 Configure 的开头添加:

app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});

在使用 IIS反向代理 时,获取IP 地址 非常重要。否则,您将始终收到本地主机。没有选项的 UseForwardedHeaders() 什么都不做! (此外,您还需要使用远程服务器进行测试设置)

获取用户名 似乎只是在请求失败时起作用(通过 500 Internal Server Error 测试)。否则 HttpContextAccessor 不会填充用户对象。可能是 2.1 的东西,很烦人,也许有人找到了一种方法来为每个请求获取它。

最后,您的信息应该到达 ApplicationInsights,如下所示:
enter image description here

关于c# - 在 Application Insight .Net Core 2.1 中使用自定义属性记录用户名和 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52854319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com