Как получить имя вызванной операции в инспекторе сообщений 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>";
}