Как получить имя вызванной операции в инспекторе сообщений WCF - PullRequest
15 голосов
/ 19 марта 2010

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

public class LogMessageInspector :
    IDispatchMessageInspector, IClientMessageInspector

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

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

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

instanceContext.GetServiceInstance().GetType().Name

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

Ответы [ 5 ]

11 голосов
/ 19 марта 2010

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

var action = OperationContext.Current.IncomingMessageHeaders.Action;
var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1);
8 голосов
/ 01 марта 2011
var operationName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;
4 голосов
/ 10 октября 2014

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

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

Возвращаемое значение этого метода и формат строки path работают вполне гармонично в этом сценарии:

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

1 голос
/ 08 октября 2012
OperationContext.Current.IncomingMessageHeaders.Action.Split('/').ToList().Last();
0 голосов
/ 01 ноября 2018

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

WCF-библиотека Microsoft Application Insights SDK Labs делает это согласованное усилие:

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