将自定义属性添加到 WCF 中的应用程序见解请求遥测



我正在尝试将有关我们收到的消息(基本上是其应用程序级结果(的一些其他信息获取到 WCF 服务的应用程序见解RequestTelemetry对象中。

应用程序见解已记录请求遥测数据。我创建了一个正在运行的ITelemetryInitializer,但在它运行时,我无法找到有关请求的信息,更不用说请求上下文中特定于应用程序的数据了。

是否有我可以放置ITelemetryInitializer运行时可以访问的数据的地方?

public class WcfServiceTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
if (telemetry is RequestTelemetry rTelemetry)
{
// HttpContext.Current is populated at this point, but doesn't seem to be available within my application code.
// So is System.ServiceModel.OperationContext.Current
}
}
}

我不得不面对作者描述的类似问题。尝试通过实施ITelemetryInitializer/ITelemetryProcessor但没有工作。

最终编写了我自己的MessageTraceTelemetryModule类,实现了IWcfTelemetryModuleIWcfMessageTrace

OnTraceResponse方法中,我通过从OperationContext中提取值(可在此处访问!

internal class MessageTraceTelemetryModule : IWcfTelemetryModule, IWcfMessageTrace
{
public void OnTraceResponse(IOperationContext operation, ref Message response)
{
if (OperationContext.Current.IncomingMessageProperties.TryGetValue("clientID", out object value))
{
operation.Request.Properties.Add("clientID", value.ToString());
}
}
}

应用程序见解遥测中可见的新自定义属性 - 客户端 ID 自定义属性 Pic。
请注意,clientID属性是在消息检查器的OperationContext中设置的:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
if(!OperationContext.Current.IncomingMessageProperties.ContainsKey("clientID"))
OperationContext.Current.IncomingMessageProperties.Add("clientID", clientID);
}

简要上下文:
我在基于SOAP 的 WCF 服务中实现了基于 AAD 令牌的身份验证。
我需要存储令牌中的clientID(在消息检查器中验证(,并在应用程序见解请求遥测中添加与custom property相同的内容。

引用:

  1. 邮件检查器文档
  2. WCF 文档

    的应用程序见解

如果它对任何人有帮助,应用程序见解会自动从您存储在System.Diagnostics.Activity.Current.AddBaggage()中的数据中添加自定义维度,或者至少在 asp.net 5 中这样做。这可能在WCF土地上的正确位置可用。

例如

var currentActivity = System.Diagnostics.Activity.Current;
if (currentActivity != null)
{
currentActivity.AddBaggage("MyPropertyName", someData);
}

要记录自定义属性,您可以尝试这样做...

public class CustomTelemetry : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
if (requestTelemetry == null) return;
requestTelemetry.Properties.Add("CustomProperty", "DummyValue");
}
}

并在申请开始时注册CustomTelemetry

TelemetryConfiguration.Active.TelemetryInitializers.Add(new CustomTelemetry());

这是原始答案

MS 文档 - 用于自定义事件和指标的应用程序见解 API

最新更新