首页 > 解决方案 > Net Core 2 WebApi 中的 Application Insights - 共享上下文以附加属性

问题描述

我们希望在 Application Insights 中记录附加到我们系统的每个授权请求的用户名。

我面临的问题是,使用本文作为指南,InvalidOperationException每当我尝试访问会话时它都会抛出一个。

public class PropertyTelemetryInitializer : ITelemetryInitializer
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public PropertyTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void Initialize(ITelemetry telemetry)
    {
        try
        {
            if (!(telemetry is RequestTelemetry requestTelemetry))
                return;

            if (_httpContextAccessor.HttpContext?.Session == null || !_httpContextAccessor.HttpContext.Session.IsAvailable)
                return;

            var userId = _httpContextAccessor.HttpContext.Session.GetInt32("UserId");
            requestTelemetry.Context.Properties["userId"] = userId?.ToString();
        }
        catch (Exception)
        {
            // Throws "Session has not been configured for this application or request."

        }

    }
}

我们从 WebApi 系统中每个控制器的基类中的会话中获取用户详细信息 -有没有办法在该点获取当前请求上下文并将 userId 附加到该请求级别的 Properties 集合中?

标签: c#asp.net-core-2.0azure-application-insights

解决方案


是的,您可以访问RequestTelemetry控制器内部,如下所示。

    // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            var requestTelemetry = HttpContext.Features.Get<RequestTelemetry>();
            requestTelemetry.Context.Properties["userId"] = "myuserid"
            return new string[] { "value1", "value2" };
        }

推荐阅读