如何在AfterReceiveRequest中获取调用的服务方法

时间:2014-07-25 11:57:46

标签: c# wcf interceptor

我有一个WCF拦截器,每次请求都会调用它:

public class WebServiceInterceptor : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        var action = OperationContext.Current.IncomingMessageHeaders.Action;
        var name = instanceContext.GetServiceInstance().GetType().Name;
        if (action != null)
        {
            var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1);
        }
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
    }
}

如何获取将被调用的Service类的Method名称? 我想从这个方法中获取一个属性。

2 个答案:

答案 0 :(得分:1)

所有字符串处理都是黑客且不可靠。学习使用WCF为您提供的元数据。您不需要解析类型名称之外的任何内容。

当您注册此IDispatchMessageInspector时,您可能拥有必要的元数据(例如OperationDescription)。将该信息传递给类构造函数并将其存储在实例字段中。这样,AfterReceiveRequest以后可以使用该信息。

答案 1 :(得分:0)

我在这里找到答案:https://stackoverflow.com/a/5150194/1453662

string methodName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;
MethodInfo info = instanceContext.GetServiceInstance().GetType().GetMethod(methodName);

这不适用于SOAP请求(我们只使用http)