Не могу найти 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]. Это исправило это.

Другие вопросы по тегам