首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpContext和TelemetryInitializer

HttpContext和TelemetryInitializer
EN

Stack Overflow用户
提问于 2016-07-16 16:11:58
回答 3查看 6.8K关注 0票数 12

我希望将用户的"client_id“声明作为属性附加到发送到Application的每个请求中。

根据我所读到的,我应该实现ITelemetryInitializer,但是为了检索"client_id“,我需要请求的HttpContext。见我的首字母:

代码语言:javascript
复制
public class ClaimTelemetryInitializer : ITelemetryInitializer
{
    public HttpContext HttpContext { get; set; }

    public void Initialize(ITelemetry telemetry)
    {
        this.AddTelemetryContextPropertFromClaims(telemetry, "client_id");
    }

    private void AddTelemetryContextPropertFromClaims(ITelemetry telemetry, string claimName)
    {
        if (HttpContext != null)
        {
            var requestTelemetry = telemetry as RequestTelemetry;

            var claim = HttpContext.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase));

            if (claim != null)
            {
                telemetry.Context.Properties[claimName] = claim.Value;
            }
        }
    }
}

我可以创建一个动作过滤器来每次设置上下文,但这感觉很糟糕:

代码语言:javascript
复制
public class TrackClaimsAttribute : ActionFilterAttribute
{
    public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var initialiser = TelemetryConfiguration.Active.TelemetryInitializers.OfType<ClaimTelemetryInitializer>().Single();

        initialiser.HttpContext = context.HttpContext;

        return base.OnActionExecutionAsync(context, next);
    }
}

有没有更好的方法来实现我想做的事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-16 17:33:36

您应该实现WebTelemetryInitializerBase,它为您提供HttpContext。

您的代码应该如下所示:

代码语言:javascript
复制
public class ClaimTelemetryInitializer : WebTelemetryInitializerBase
{
    protected override void OnInitializeTelemetry(
            HttpContext platformContext,
            RequestTelemetry rootRequestTelemetry, 
            ITelemetry telemetry) {

            var claim = HttpContext.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase));

            if (claim != null)
            {
                telemetry.Context.Properties[claimName] = claim.Value;
            }
    }
}
票数 8
EN

Stack Overflow用户

发布于 2019-09-11 11:41:31

我建议在HttpContextAccessor类的构造函数中注入一个ClaimTelemetryInitializer实例,然后您可以使用它从HttpContext中提取值。或者,更好的是,为您的TelemetryInitializer创建一个基类,并使用它的构造函数注入HttpContextAccessor实例。

例如:

代码语言:javascript
复制
    protected ClaimTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public void Initialize(ITelemetry telemetry)
    {
        var context = this.httpContextAccessor.HttpContext;
        if (context == null)
        {
            return;
        }

        var claim = context.User.Claims.SingleOrDefault(x => x.Type.Equals(claimName, StringComparison.InvariantCultureIgnoreCase));
        //Do logic here...
    }
票数 8
EN

Stack Overflow用户

发布于 2019-02-14 19:38:21

我希望这是设计成AppInsights的,但是您可以直接使用静态HttpContext.Current。您可以使用它的每个请求的Items字典作为短期(接近无状态)存储空间,将您的自定义值传递给自定义遥测处理程序。

所以试试

代码语言:javascript
复制
class AppInsightCustomProps : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        // Is this a TrackRequest() ?
        if (requestTelemetry == null) return;

        var httpCtx = HttpContext.Current;
        if (httpCtx != null)
        {
            var customPropVal = (string)httpCtx.Items["PerRequestMyCustomProp"];
            if (!string.IsNullOrWhiteSpace(customPropVal))
            {
                requestTelemetry.Properties["MyCustomProp"] = customPropVal;
            }
        }
    }
}

并对所需的自定义属性进行编程,在请求管道中的任何位置都有以下内容

代码语言:javascript
复制
if (HttpContext.Current != null)
{
    HttpContext.Current.Items["PerRequestMyCustomProp"] = myCustomPropValue;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38413032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档