Обработчик операций WCF Web Api работает неправильно? - PullRequest
1 голос
/ 26 января 2012

Я создаю веб-API с помощью предварительного просмотра веб-интерфейса WCF 6, в настоящее время у меня возникла небольшая проблема.Я хотел бы иметь обработчик операции для внедрения принципала IP в операцию, чтобы определить, какой пользователь делает запрос.У меня уже есть этот обработчик операций, и он уже настроен.Но я заметил, что когда я декорирую операцию с помощью атрибута WebInvoke и одновременно операция получает IPrincipal и другой объект домена, система выдает исключение, говорящее мне:

HttpOperationHandlerFactory не может определить входные данныепараметр, который должен быть связан с содержимым сообщения запроса для операции службы «NameOfTheOperation».Если операция не ожидает содержимого в сообщении запроса, используйте метод HTTP GET с операцией.В противном случае убедитесь, что для одного входного параметра свойство IsContentParameter имеет либо значение True, либо тип, который можно назначить одному из следующих параметров: HttpContent, ObjectContent 1, HttpRequestMessage or HttpRequestMessage 1.

Не знаюзнать, что здесь происходит.Чтобы дать вам некоторую предысторию, я опубликую часть своего кода, чтобы вы знали, как я это делаю.

Операция:

[WebInvoke(UriTemplate = "", Method = "POST")]
    [Authorization(Roles = "")]
    public HttpResponseMessage<dto.Diagnostic> RegisterDiagnostic(dto.Diagnostic diagnostic, IPrincipal principal)
    {
       ......
    }

Веб-API WCF знает, когда вводить IPrincipalпотому что я украшаю операцию с помощью пользовательского атрибута Authorization.

Конфигурация в глобальном файле:

var config = new WebApiConfiguration() {EnableTestClient = true};
        config.RegisterOAuthHanlder(); //this is an extension method
        routes.SetDefaultHttpConfiguration(config);

        routes.MapServiceRoute<MeasurementResource>("Measurement");
        routes.MapServiceRoute<DiagnosticResource>("Diagnostic");

Затем метод RegisterOAuthHandler добавляет в операцию обработчик операции, если он был украшенТаможенная авторизация.Вот как это выглядит:

public static WebApiConfiguration RegisterOAuthHanlder(this WebApiConfiguration conf)
    {
        conf.AddRequestHandlers((coll, ep, desc) =>
        {
            var authorizeAttribute = desc.Attributes.OfType<AuthorizationAttribute>().FirstOrDefault();
            if (authorizeAttribute != null)
            {
                coll.Add(new OAuthOperationHandler(authorizeAttribute));
            }
        });
        return conf;
    }

    public static WebApiConfiguration AddRequestHandlers(
       this WebApiConfiguration conf,
       Action<Collection<HttpOperationHandler>, ServiceEndpoint, HttpOperationDescription> requestHandlerDelegate)
    {
        var old = conf.RequestHandlers;
        conf.RequestHandlers = old == null ? requestHandlerDelegate : (coll, ep, desc) =>
        {
            old(coll, ep, desc);
        };
        return conf;
    }

Может кто-нибудь помочь мне с этим?Спасибо заранее!

1 Ответ

3 голосов
/ 26 января 2012

Попробуйте обернуть ваш диагностический параметр в ObjectContent, т.е. ObjectContent<Diagnostic>. Затем вы будете использовать метод ReadAs (), чтобы вытащить объект.

Это должно работать.

...