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