WCF从OperationContext检索方法名称和参数类型

WCF从OperationContext检索方法名称和参数类型,wcf,reflection,operationcontext,Wcf,Reflection,Operationcontext,要在WCF服务器中自定义授权,我重写ServiceAuthorizationManager.CheckAccessCore()。在其中,我需要使用OperationContext定位客户端调用的方法。我在这篇优秀的帖子中找到了部分解决方案: 我的案例(简化)如下: [ServiceContract] public interface IMyService { [OperationContract] void Hello(string name); } public Class

要在WCF服务器中自定义授权,我重写ServiceAuthorizationManager.CheckAccessCore()。在其中,我需要使用OperationContext定位客户端调用的方法。我在这篇优秀的帖子中找到了部分解决方案:

我的案例(简化)如下:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    void Hello(string name);
}

public Class MyService : IMyService
{
    // this method is not part of service contract
    public void Hello()
    {
        Console.WriteLine("Hello World!");
    }

    public void Hello(string name)
    {
        Console.WriteLine(string.Format("Hello {0}!", name);
    }
}
从上述帖子获取MethodInfo的代码是:

string action = operationContext.IncomingMessageHeaders.Action;
DispatchOperation operation = 
    operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o =>
        o.Action == action);

Type hostType = operationContext.Host.Description.ServiceType;
MethodInfo method = hostType.GetMethod(operation.Name);
调用Hello(“Jake”)时,operationContext.IncomingMessageHeaders.Action提供方法名“Hello”,同时我还需要参数类型来获得正确的方法。(hostType.GetMethod(operation.Name)抛出一个模糊的UsMatchException)


我可以从OperationContext获取参数类型吗?

在WCF中,继承的概念仅限于接口,在WCF中不能在服务类级别使用继承的概念。请参阅

  • WCF甚至不允许直接重载函数,所以您可以愉快地依赖于Action属性,而不用担心方法/函数参数。即使您希望在服务中使用与同名的函数,也需要使用“OperationContract”的Action decorator/property为客户端提供一个新名称。希望这能帮助你解决困惑
    基类不是WCF服务。它只是WCF服务类的一个基类。由于这造成了误解,我从这个问题上消除了继承的噪音。希望现在一切都清楚了。在我的场景中,一个重载方法被指定为服务操作,而另一个不是。我可以重新组织代码以避免服务类中的重载方法,但它会引入其他复杂性,如果可能的话,我宁愿避免这种复杂性。