2012-03-08 10 views
6
public class ContactsController : ApiController 
{ 
    private static readonly List<Contact> _contacts = new List<Contact>(); 
    public Contact PutContacts(int id, Contact contact) 
    { 
     if (_contacts.Any(c => c.Id == contact.Id) == false) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     contact.LastModified = DateTime.Now; 
     return contact; 
    } 
} 

HTTP入れヘッダ入れWEBAPI:"...パラメータ辞書は、パラメータにnullエントリが含まれています"

PUT /api/contacts/3 HTTP/1.1 
User-Agent: Fiddler 
Content-Type: application/json 
Host: localhost:8080 

をボディ:

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"[email protected]","LastModified":"2012-03-08T23:42:13.8681395+08:00"} 

応答:

HTTP/1.1 400 Bad Request 
"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'SelfHost.Contact PutContacts(Int32, SelfHost.Contact)' in 'SelfHost.ContactsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter." 

なぜですか?ありがとう。

PS:私はあなたが記述されている問題を再現することができません

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
+0

私はこの同じ問題があります。あなたはそれを把握しましたか? –

答えて

1

モデル:

public class Contact 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string Email { get; set; } 
    public DateTime LastModified { get; set; } 
} 

コントローラー:

public class ContactsController : ApiController 
{ 
    public Contact Put(int id, Contact contact) 
    { 
     return contact; 
    } 
} 

クライアント:私はクライアントを実行すると

class Program 
{ 
    static void Main() 
    { 
     using (var client = new WebClient()) 
     { 
      client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
      var data = Encoding.UTF8.GetBytes(@"{""Id"":3,""Name"":""mmm"",""Phone"":""000 000 0000"",""Email"":""[email protected]"",""LastModified"":""2012-03-08T23:42:13.8681395+08:00""}"); 
      var result = client.UploadData("http://localhost:1405/api/contacts/4", "PUT", data); 
      Console.WriteLine(Encoding.UTF8.GetString(result)); 
     } 
    } 
} 

は、次のリクエストが送信されている:

PUT /api/contacts/4 HTTP/1.1 
Content-Type: application/json 
Host: localhost:1405 
Content-Length: 119 
Expect: 100-continue 
Connection: Keep-Alive 

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"[email protected]","LastModified":"2012-03-08T23:42:13.8681395+08:00"} 

と私は正しい結果をサーバーから取得します。だから私はあなたが表示されている要求は、サーバーに送信されている実際の要求ではないと思います。

+0

私はあなたのコードを試みました。しかし、エラーは終了します。私はVS11ベータ&mvc4 Web APIで試してみます。 –

2

私はこの同じ問題を抱えています。クエリパラメータ "id"がnullで、オブジェクト "contact"が記入されています。これはモデルバインディングの問題だと思います。コントローラーにブレークポイントを置く場合は、次の式を見てください。

this.ControllerContext.RouteData.Values["id"] 

この値はルートデータに表示されます。そのモデルに設定されていないだけです。私はActionFilterを持っており、そこにブレークポイントを置くと、actionContextのActionArgumentにはキーがありますが、null値があることがわかります。イムは、まだ研究

...

+0

FYI、私もVS.NET 11 Betaを使用しています。 – craigtadlock

+0

私はこれをWeb APIチームにバグとして投稿しました。 http://aspnetwebstack.codeplex.com/workitem/46 – craigtadlock

+0

これはVS.NET 11ベータ版で確認されたバグです。これはすでにコードプレックスリンクのソースで修正されていますが、公式リリースはまだありません。 – craigtadlock

0

craigtadlock、あなたの助けとマイクロソフトの上のバグを送ってくれてありがとう。私はPUTで同じ問題を抱えていました。彼らのどれも働かなかった。回避策として、POSTを処理するためにPOSTをハッキングしました。サーバーに投稿しているオブジェクトに既にIDがある場合、POSTコードはそのIDを持つPUTとして扱います。擬似コードは:

public HttpResponseMessage<MyClass> PostMyClass(MyClass myObject) 
{ 
    if(myObject.ID != 0){ 
     //do PUT code 
    }else{ 
     //do POST code 
    } 
} 
+0

実際には、サーバー側PUTハンドラからIDパラメータを削除するだけで、よりうまく動作します。0123ID == 0){// リターンエラー }他{(myObjectというが存在する場合 ) //は他コード //戻りNOT_FOUNDコード を入れません}} – Brian

関連する問題