WCF 服务操作名称
WCF service operation name
有没有办法配置 App Insights 在监视 WCF 服务时收集操作名称?所有请求都被 URL 集中在一起(它们只是以 .svc 结尾的 POST),因此没有简单的方法来确定在服务上调用了哪个特定操作。
是否需要自定义 Telemetry Initializer 以某种方式确定实际调用了哪个操作并设置自定义 属性?如果是,如何确定当前的 WCF 操作名称?
布雷特,
可以通过两种方式自定义操作名称:
1) 使用自定义遥测初始化程序 - 专门设置操作名称。
有关遥测初始化程序的更多信息:Custom Telemetry Initializers
2) 从 sdk 版本 2-beta3 开始,auto-generated 请求遥测可通过 HttpContext 扩展方法访问:
System.Web.HttpContextExtension.GetRequestTelemetry
检索到请求遥测数据后,可以更改与其关联的操作名称。
如果这解决了您的问题,请告诉我。
谢谢,
卡尔提克
另一种收集 WCF 操作数据的方法是使用 Microsoft.ApplicationInsights.Wcf Nuget 包。您可以阅读更多相关信息 here。
如果您想在 Application Insight 中获取从客户端调用的 WCF 方法的名称,您可以使用以下 ITelemetryInitializer
在 .net 5.0 中,httprequest 对象存储在遥测上下文的原始对象属性中。
public class SoapActionHeaderTelemetryInitializer : ITelemetryInitializer
{
private static readonly Regex _soapActionUri = new Regex("^\"(?<uri>.*)\"$", RegexOptions.Compiled);
public void Initialize(ITelemetry telemetry)
{
DependencyTelemetry httpDependency = telemetry as DependencyTelemetry;
if (httpDependency != null)
{
httpDependency.Context.TryGetRawObject("HttpRequest", out var request);
if (request is HttpRequestMessage httpRequest)
{
if (httpRequest.Headers.TryGetValues("SOAPAction", out var values) && values.Any())
{
// SOAP Action is contained within quote : https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528
var soapAction = _soapActionUri.Match(values.First()).Groups["uri"].Value;
telemetry.Context.GlobalProperties["SOAPAction"] = soapAction;
}
}
}
}
}
有没有办法配置 App Insights 在监视 WCF 服务时收集操作名称?所有请求都被 URL 集中在一起(它们只是以 .svc 结尾的 POST),因此没有简单的方法来确定在服务上调用了哪个特定操作。
是否需要自定义 Telemetry Initializer 以某种方式确定实际调用了哪个操作并设置自定义 属性?如果是,如何确定当前的 WCF 操作名称?
布雷特,
可以通过两种方式自定义操作名称:
1) 使用自定义遥测初始化程序 - 专门设置操作名称。 有关遥测初始化程序的更多信息:Custom Telemetry Initializers
2) 从 sdk 版本 2-beta3 开始,auto-generated 请求遥测可通过 HttpContext 扩展方法访问:
System.Web.HttpContextExtension.GetRequestTelemetry
检索到请求遥测数据后,可以更改与其关联的操作名称。
如果这解决了您的问题,请告诉我。
谢谢, 卡尔提克
另一种收集 WCF 操作数据的方法是使用 Microsoft.ApplicationInsights.Wcf Nuget 包。您可以阅读更多相关信息 here。
如果您想在 Application Insight 中获取从客户端调用的 WCF 方法的名称,您可以使用以下 ITelemetryInitializer
在 .net 5.0 中,httprequest 对象存储在遥测上下文的原始对象属性中。
public class SoapActionHeaderTelemetryInitializer : ITelemetryInitializer
{
private static readonly Regex _soapActionUri = new Regex("^\"(?<uri>.*)\"$", RegexOptions.Compiled);
public void Initialize(ITelemetry telemetry)
{
DependencyTelemetry httpDependency = telemetry as DependencyTelemetry;
if (httpDependency != null)
{
httpDependency.Context.TryGetRawObject("HttpRequest", out var request);
if (request is HttpRequestMessage httpRequest)
{
if (httpRequest.Headers.TryGetValues("SOAPAction", out var values) && values.Any())
{
// SOAP Action is contained within quote : https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528
var soapAction = _soapActionUri.Match(values.First()).Groups["uri"].Value;
telemetry.Context.GlobalProperties["SOAPAction"] = soapAction;
}
}
}
}
}