我在WCF中正在做一个消息检查器:
public class LogMessageInspector :
IDispatchMessageInspector, IClientMessageInspector
实现方法:
public object AfterReceiveRequest(ref Message request,
IClientChannel channel, InstanceContext instanceContext)
我可以使用以下命令获取被调用服务的名称:
instanceContext.GetServiceInstance().GetType().Name
但是如何获取被调用操作的名称?
答案 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>";
}