Не могу найти DispatchOperation по имени в WCF Расширяемость для запроса GET
Недавно я столкнулся с проблемой, которая бросает меня в тупик.
Я реализовал пользовательский AuthorizationManager в WCF, который сначала должен получить операцию по имени. Службы WCF предоставляются через конечные точки REST и SOAP, поэтому я должен проверить в нескольких местах, чтобы найти информацию, необходимую для продолжения процесса аутентификации.
Все было хорошо, и у меня работает около 15-20 служб, но я только недавно столкнулся с проблемой, когда я не могу получить имя операции, используя мои обычные методы.
Код для операции pull выглядит следующим образом:
public class AuthorizationManager : ServiceAuthorizationManager
{
private ServiceEndpoint _endpoint { get; set; }
public AuthorizationManager(ServiceEndpoint endpoint)
{
_endpoint = endpoint;
}
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
var buffer = message.CreateBufferedCopy(Int32.MaxValue);
message = buffer.CreateMessage();
var originalMessage = buffer.CreateMessage();
/*Step 1 - Pull Operation*/
string action = operationContext.IncomingMessageHeaders.Action ?? OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;
DispatchOperation operation = operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o => o.Name == action || o.Action == action);
Type hostType = operationContext.Host.Description.ServiceType;
var operationInfo = hostType.GetMethod(operation.Name);
/*Continue here using operationInfo - but operation is null*/
}
}
Это было полезно для извлечения правильной операции для конечных точек REST и SOAP, но теперь действие пусто.
Определение сервиса следующее:
[ServiceContract]
public interface ICollectionService
{
[OperationContract]
[WebGet]
CollectionResponse GetCollection()
}
Кажется, все довольно стандартно, я просто не могу понять, почему это работает иначе, чем другие мои сервисы.
1 ответ
Я понял, что недостаточно тщательно проверял определение своего сервиса и использовал [WebInvoke] вместо [WebGet]. Это исправило это.