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;
                }
            }
        }
    }
}