Как получить имя вызванной операции в инспекторе сообщений WCF

Я делаю инспектор сообщений в WCF:

public class LogMessageInspector :
    IDispatchMessageInspector, IClientMessageInspector

который реализует метод:

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

Я могу получить имя вызванного сервиса с помощью:

instanceContext.GetServiceInstance().GetType().Name

Но как я могу получить имя вызванной операции?

5 ответов

Это не красиво, но это то, что я сделал, чтобы получить имя операции:

var action = OperationContext.Current.IncomingMessageHeaders.Action;
var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1);
var operationName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;

Этот подход похож на другие, представленные здесь, но использует Path.GetFileName:

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

Возвращаемое значение этого метода и формат path Струнная работа довольно гармонично в этом сценарии:

Символы после последнего символа каталога в пути. Если последний символ пути является символом каталога или разделителя томов, этот метод возвращает String.Empty. Если путь равен нулю, этот метод возвращает ноль.

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

Немного опоздал на вечеринку, но мне пришлось копать немного глубже, чем существующие ответы на этот вопрос, потому что они, кажется, связаны с получением имени действия, а не имени операции. (Часто они одинаковы, поэтому получение имени действия фактически дает имя операции.)

Библиотека WCF Application Insights SDK от Microsoft прилагает совместные усилия:

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>";
}
Другие вопросы по тегам