0

为了在 WCF 服务器中自定义授权,我重写了 ServiceAuthorizationManager.CheckAccessCore()。在其中我需要找到客户端使用 OperationContext 调用的方法。我在这篇出色的帖子中找到了部分解决方案:WCF: Retrieving MethodInfo from 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) 抛出 AmbiguousMatchException)

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

4

1 回答 1

0

在 WCF 中,继承的概念仅限于接口,不能在 WCF 的服务类级别使用继承的概念。请参考http://www.codeproject.com/Questions/302481/WCF-Service-Inharitance

  1. WCF 甚至不允许直接重载函数,因此您可以愉快地依赖 Action 属性,而不必担心方法/函数参数。即使您想在您的服务中使用具有相同名称的函数,您也需要使用“OperationContract”的操作装饰器/属性来提供一个新名称,以便向客户端公开它。希望这将帮助您解决您的困惑。
于 2014-03-07T19:05:16.183 回答