18

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

public class LogMessageInspector :
    IDispatchMessageInspector, IClientMessageInspector

它实现了该方法:

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

我可以通过以下方式获取调用服务的名称:

instanceContext.GetServiceInstance().GetType().Name

但是我如何获得被调用操作的名称呢?

4

5 回答 5

12

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

var action = OperationContext.Current.IncomingMessageHeaders.Action;
var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1);
于 2010-03-19T12:30:48.467 回答
8
var operationName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;
于 2011-03-01T03:31:23.600 回答
4

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

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

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

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

于 2014-10-09T20:12:41.710 回答
2
OperationContext.Current.IncomingMessageHeaders.Action.Split('/').ToList().Last();
于 2012-10-08T03:00:47.027 回答
1

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

Microsoft 的 Application Insights SDK Labs 的 WCF 库做出了这样的协同努力:

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>";
}
于 2018-11-01T11:13:12.797 回答