如何解决将 Asp.Net HeaderPropogation 库新创建的标头添加到遥测
services.AddHeaderPropogation(o =>
{
o.Headers.Add("Id")
o.Headers.Add("Id",context => {
return new StringValues(Guid.NewGuid().ToString())
});
});
上面的代码帮助我创建一个名为 id 的标头,如果它不存在新的 guid,如果它存在,它将只使用该值。这是使用 Microsoft Header Propogation nuget 包。它有效。 但是现在我需要将其添加到 Azure 应用程序洞察中,但是执行它的标准方法仅在传入请求具有标头时才有效。如果创建了新的 GUID,它不会触发 ITelemetryInitializer 调用。
因为为了添加 Telmetry 自定义值,我们有一个继承 ITelemtryInitializer 的类,在里面我确实调用了 Request.Headers,如下所示:
var requestTelemetry = telemetry as RequestTelemetry
if(context.Request.Headers.TryGetValue(id,out var value))
requestTelemtry.Properties[id] = value.ToString()
但是上面的行永远不会被触发,因为 Request.Headers 从来没有这个 id。这个id只会在api调用下一个服务时由中间件创建。
所以我的问题是,有没有办法从 Startup> ConfigfureServices 和 HeaderPropogation 代码中调用遥测类,这样一旦创建了新的 GUID,我就可以将它添加到遥测中。添加到遥测的所有示例都来自控制器或 DI。如何从 Startup 本身调用它? 或者有没有更好的方法来实现相同的目标?
解决方法
让我发布我找到的解决方案。我不需要有一个遥测初始化器类来填充另一个类中的 guid。我希望它在我们创建后立即添加,所以这就是我在启动时修改服务中的头传播代码的方式。
services.AddHeaderPropagation(options =>
{
var correlationId = "YourId";
options.Headers.Add(correlationId,context => {
var requestTelemetry = context.HttpContext.Features.Get<RequestTelemetry>();
if (context.HttpContext.Request.Headers.TryGetValue(correlationId,out var value))
{
requestTelemetry.Properties[correlationId] = value.ToString();
return value.ToString();
}
else
{
var guidId = Guid.NewGuid().ToString();
requestTelemetry.Properties[correlationId] = guidId;
return new StringValues(guidId);
}
});
});
对我来说,关键是意识到我可以使用此属性选项在代码中的任何地方获取 RequestTelemetry。
var requestTelemetry = context.HttpContext.Features.Get<RequestTelemetry>();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。