如何在WCF消息检查器中获取调用的操作名称

时间:2010-03-19 12:19:50

标签: wcf c#-3.0 operation idispatchmessageinspector

我在WCF中正在做一个消息检查器:

public class LogMessageInspector :
    IDispatchMessageInspector, IClientMessageInspector

实现方法:

public object AfterReceiveRequest(ref Message request,
    IClientChannel channel, InstanceContext instanceContext)

我可以使用以下命令获取被调用服务的名称:

instanceContext.GetServiceInstance().GetType().Name

但是如何获取被调用操作的名称?

5 个答案:

答案 0 :(得分:11)

它不漂亮,但这是我为获取操作名称所做的:

var action = OperationContext.Current.IncomingMessageHeaders.Action;
var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1);

答案 1 :(得分:8)

var operationName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;

答案 2 :(得分:4)

此方法与此处介绍的其他方法类似,但使用Path.GetFileName

Path.GetFileName(OperationContext.Current.IncomingMessageHeaders.Action);

在这种情况下,此方法的返回值和path字符串的格式非常协调:

  

路径中最后一个目录字符后面的字符。如果是最后一个   path的字符是目录或卷分隔符,这个   方法返回String.Empty。如果path为null,则此方法返回   空。

答案 3 :(得分:1)

OperationContext.Current.IncomingMessageHeaders.Action.Split('/').ToList().Last();

答案 4 :(得分:0)

参加聚会的时间不多,但是我不得不比这个问题上的现有答案更深入一点,因为它们似乎涉及获得动作名称而不是操作名称。 (通常它们是相同的,因此获取操作名称确实可以获取操作名称。)

Microsoft的Application Insights SDK Labs的WCF库做出了this的共同努力:

private string DiscoverOperationName(OperationContext operationContext)
{
    var runtime = operationContext.EndpointDispatcher.DispatchRuntime;
    string action = operationContext.IncomingMessageHeaders.Action;
    if (!string.IsNullOrEmpty(action))
    {
        foreach (var op in runtime.Operations)
        {
            if (op.Action == action)
            {
                return op.Name;
            }
        }
    }
    else
    {
        // WebHttpDispatchOperationSelector will stick the
        // selected operation name into a message property
        return this.GetWebHttpOperationName(operationContext);
    }

    var catchAll = runtime.UnhandledDispatchOperation;
    if (catchAll != null)
    {
        return catchAll.Name;
    }

    return "*";
}

private string GetWebHttpOperationName(OperationContext operationContext)
{
    var name = WebHttpDispatchOperationSelector.HttpOperationNamePropertyName;
    if (this.HasIncomingMessageProperty(name))
    {
        return this.GetIncomingMessageProperty(name) as string;
    }

    return "<unknown>";
}