WCF извлекает имя метода и типы параметров из OperationContext

Чтобы настроить авторизацию на сервере WCF, я переопределяю ServiceAuthorizationManager.CheckAccessCore(). В нем мне нужно найти метод, вызываемый клиентом с помощью OperationContext. Я нашел частичное решение в этом отличном сообщении: WCF: Получение MethodInfo из 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?

1 ответ

В WCF концепция наследования ограничена интерфейсами. Вы не можете использовать концепцию наследования на уровне класса обслуживания в WCF. Пожалуйста, обратитесь http://www.codeproject.com/Questions/302481/WCF-Service-Inharitance

  1. WCF даже не позволяет напрямую перегружать функции, поэтому вы можете с радостью полагаться на свойство Action, не беспокоясь о параметрах метода / функции. Даже если вы хотите использовать функции с одинаковыми именами в вашем сервисе, вам также нужно дать новое имя, под которым оно предоставляется клиентам, используя Action decorator/ свойство "OperationContract". Надеюсь, что это поможет вам решить вашу путаницу.
Другие вопросы по тегам