我正在尝试将有关我们收到的消息(基本上是其应用程序级结果(的一些其他信息获取到 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
类,实现了IWcfTelemetryModule
和IWcfMessageTrace
。
在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
相同的内容。
引用:
- 邮件检查器文档
- 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