2012-10-06 15 views
12

JSONデータをWeb APIメソッドにPOSTしようとしていますが、JSONデータがモデルにバインドされていません。ASP.Net Web ApiがPOSTでバインドされていないモデル

[DataContract] 
public class RegisterDataModel 
{ 
    [DataMember(IsRequired = true)] 
    public String SiteKey { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserId { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserName { get; set; } 
} 

はここに私のWeb APIをアクションです:私は[ModelBinder]を追加する前に

public class RegisterController : ApiController 
    { 
    public Guid Post([ModelBinder] RegisterDataModel registerDataModel) 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new ModelStateApiException(ModelState); 
     } 
     var userProfileDataContract = userProfileBusinessLibrary.GetNewOne(); 
     userProfileDataContract.UserId = registerDataModel.UserId; 
     userProfileDataContract.UserName = registerDataModel.UserName; 

     var userKey = userProfileBusinessLibrary.Register(registerDataModel.SiteKey, userProfileDataContract); 

     return userKey; 
    } 
    } 

は、registerDataModelがnullだった

は、ここに私のモデルです。 [ModelBinder]を追加した後、registerDataModelはRegisterDataModelインスタンスですが、すべてのプロパティ値はnullです。

http://local.testwebsite.com/api/register 

Request Headers: 
User-Agent: Fiddler 
Host: local.testwebsite.com 
Content-Length: 89 
Content-Type: application/json; charset=utf-8: 

Request Body: 
{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
}  

私はRegisterDataModelプロパティに私のポストのデータバインドを作るために行方不明です:

はここにフィドラーを経由して私の要求ですか?ご協力いただきありがとうございます。

+0

コントローラのアクションに '[Post]'属性が必要なだけかもしれません。 – McGarnagle

+1

返信ありがとうございますが、[HttpPost]を追加しても役立ちませんでした。 WebApiでは、http動詞の属性は必要ありませんが、ASP.net MVCは動詞とコントローラの動作を一致させるための規約を使用しているため、私の理解です。 –

答えて

10

どのようにJSONリクエストを作成していますか?フィドラーリクエストビルダーを通して?リクエスト本文で次のようにしてください。

{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
} 

私は「Request Body:」もあなたのリクエストボディの一部であると推測しています。それを取り除いて確認してください。

+0

私はFiddlerの作曲家を使用してjsonデータをWeb APIに送信しています。ここにスクリーンショットがあります:http://screencast.com/t/x2IH6hp01rGQ –

+0

[ModelBinder]を削除するだけで、完璧に動作します。私はちょうどあなたのコードを貼り付けてコピーし、それをテストしました。ここで私が見ている違いの1つは、コンテンツの長さが89であることです。鉱山は正確に同じペイロードに対して64です。それで、私はあなたに「Request Body:」のようなものを送ることを推測しています。 – Badri

+4

ああ、btw、utf-8の隣に余分なコロンまたはセミコロンがあります。 Content-Type:application/json; charset = utf-8: これを削除してみてください。 – Badri

11

OPの問題に関連して、私は(パブリック)を使用する場合、質問 のタイトルはここに私を導いていないフィールド代わりのModelクラス(すなわち、無{get; set;})でプロパティ 。 これによりバインディングも失敗することが判明しました。

多分誰かを助ける。

+1

私はまったく同じ問題を抱えていました。これを解決するgetとsetを追加しました。 –

+1

これは私にも役立ちました。それが削除されていないことを喜んで、それはOPがすでにプロパティを持っていたとしても、この質問タイトルに必ず属します。 –

+0

これは私を助けました。どうもありがとう! – pwaivers

0

私の場合、アプリケーションのリクエストは、.NET Web APIに転送する前に、認証/認可のために「APIマネージャ」というミドルウェアを介して渡されます。理由はわかりません。なぜなら、ヘッダーから「Content-Length」が発行されているからです。その理由は、デフォルトのJsonMediaTypeFormatterはモデルバインドを実行する前に常にContent-Lengthをチェックし、 Content-Lengthが表示されない場合は、パラメータをNULLに設定します。

関連する問題