Я, наконец, получил это работает для моих целей.
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 , проверить его на нулевое значение и добавить пользовательские свойства.В противном случае встроенные свойства для IP могут быть перезаписаны. Migrosoft GDPR Blogpost
В Startup добавьте это в ConfigureService
services.AddSingleton<ITelemetryInitializer, CustomTelemetry>();
Обязательно добавьте ContextAccessor заранее, чтобы его можно было вставить:
services.AddHttpContextAccessor();
В Configure добавьте это в начале:
app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});
Это очень важно для получения IP-адреса при использовании обратный прокси как IIS .В противном случае вы всегда получите localhost.UseForwardedHeaders () без опций просто ничего не делает!(Также вам понадобится тестовая настройка с удаленным сервером)
Получение Имя пользователя , похоже, работает только при сбое запроса (проверено с 500 Internal Server Error).В противном случае HttpContextAccessor не заполняет объект User.Может быть 2.1, довольно раздражает, может быть, кто-то найдет способ получить его для каждого запроса.
В конце ваша информация должна поступить в ApplicationInsights и выглядеть следующим образом: