2012-01-25 3 views
1

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

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) 
    { 
     ...... 
    } 

WCF Web API знает, когда впрыснуть IPrincipal, потому что я декорировать операцию с атрибутом пользовательской авторизации.

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

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; 
    } 

Может ли кто-нибудь помочь мне в этом? Заранее благодарю!

ответ

3

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

Должно работать.

+0

Отличный !! это сработало! – Daniel

+0

Полезно знать! В интегрированном стеке MVC, который приходит, это «должно» не быть проблемой. –

Смежные вопросы