2012-01-25 5 views
1

私はWCF web api preview 6を使用してWeb APIを構築していますが、現在は少し問題が残っています。どのユーザーがリクエストを行っているかを判断するために、操作にIPrincipalを注入する操作ハンドラを用意したいと思います。私はすでにその操作ハンドラを持っており、既に設定されています。しかし、私はWebInvoke属性で操作を装飾し、操作が同時にIPrincipalと他のドメインオブジェクトを受け取ると、システムは例外をスローして次のように通知することに気づきました。サービス操作 'NameOfTheOperation'の要求メッセージコンテンツに関連付けられています。操作が要求メッセージの内容を期待しない場合は、操作でHTTP GETメソッドを使用します。それ以外の場合は、確実に1つの入力パラメータは、それが「本当」に設定IsContentParameterプロパティですか、次のいずれかに割り当て可能であるタイプであるたかということ:HttpContent、ObjectContent操作ハンドラWCF Web APIが異常に機能していますか?

私はここで何が起こっているのか分かりません。あなたにいくつかの背景を与えるために、私は自分のコードのいくつかを投稿して、私は物事をどのようにしているかを知らせます。

操作:

[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"); 

それはカスタム認可attibuteが施されていた場合、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

Diagnostic(診断)パラメータをObjectContent、つまりObjectContent<Diagnostic>にラップしてみてください。次に、ReadAs()メソッドを使用してオブジェクトを取り出します。

これはうまくいくはずです。

+0

素晴らしい!出来た! – Daniel

+0

お役立ち情報統合されたMVCスタックでは、これは問題ではないはずです。 –