2012-03-06 4 views
3

は、私はこのように、要求URLで安らかな方法をユーザIDを指定することにより、ユーザオブジェクトを返すAPIメソッドを持っています。MVC 4 Web APIがGETリクエスト本体のアクションパラメータと一致するのはなぜですか?

routes.MapHttpRoute(
      "GetUserByUserId", 
      "users/{id}", 
      defaults: new { Controller = "User", Action = "GetUserByUserId" }, 
      constraints: new { httpMethod = new HttpMethodConstraint(new string[] { "GET" }) 
}); 

http://www.myapi.com/users/1

私のルートは、このようになりますコントローラーの名前はUserControllerで、メソッドはGetUserByUserIdという名前で、次のようになります。

[HttpGet] 
public User GetUserByUserId(int id) 
{ 
... returns a User object .... 
} 

メソッドを呼び出すと、ユーザーオブジェクトで応答します。 URLのid "1"は、ルートによってGetUserByUserId属性 "id"として自動的に照合されます。

しかし、(!!)、私は偶然にも、このように、リクエストボディに、あらゆる種類のJSONシリアライズされたオブジェクトを提供する場合:

{"Id":6,"PermissionId":0,"UserId":3} 

MVCは自動的にリクエストボディに「ID」プロパティをマッピングしていますGetUserByUserIdメソッドの "id"属性にオブジェクトを追加し、私のURLの "1" idを無視してください!

私にとっては、これは非常に奇妙に見えます。私はWeb APIがリクエストURLと要求本文をルーティングされたメソッドの適切な属性に自動的にマッピングすることを知っていますが、リクエスト本体の "Id"は単純なスタンドアロンの整数ではなく、複合型のプロパティですメソッド属性 "id"と解釈すべきではありません。

これはバグですか、それとも不足していますか?

+0

GETを実行する場合、リクエスト本体にJSON直列化オブジェクトをどのように提供しますか? POSTやPUTを実行していた場合、どのようにその可能性があるのか​​分かりましたが、指定したルートはhttp GETのみです。だから、どうして、「どうして」と言わなければならないのですか?あなたは誤って要求にオブジェクトを提供しますか? – MajorRefactoring

+1

HTTP/1.1標準では、GET要求を行う際にメッセージ本文の送信を明示的に禁止していません。しかし、サーバは、GETリクエストのセマンティックな意味を持たないため、リクエスト本体をGETリクエストのために解析しようとするべきではありません。だから私の意見では、MVC Web APIは、GETメッセージを間違って解析するか、これが行われた他の理由がありますか? – Fresa

答えて

3

asp.net mvcはValueProviderFactoriesを使用して、モデルバインディングの要求から値を抽出します。設定されたプロバイダはValueProviderFactories.Factories Propertyを調べることで確認できます。デフォルトの設定では、このコレクションは

  1. で構成されていChildActionValueProviderFactory
  2. FormValueProviderFactory
  3. JsonValueProviderFactory
  4. RouteDataValueProviderFactory
  5. QueryStringValueProviderFactory
  6. HttpFileCollectionValueProviderFactory

このコレクションはソートされており、JsonValueProviderFactoryはリストの上位に表示され、RouteDataValueProviderFactoryではなくidの値プロバイダとして使用されます。

関連する問題