2012-03-08 9 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 "पैरामीटर शब्दकोश पैरामीटर के लिए एक अशक्त प्रविष्टि शामिल ..."

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." 

क्यों? धन्यवाद।

पुनश्च:

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

मैंने आपके कोड की कोशिश की। लेकिन त्रुटि निकल गई है। मैं वीएस 11 बीटा और एमवीसी 4 वेब एपीआई में कोशिश करता हूं। –

2

मुझे यह समस्या है। क्वेरी पैरामीटर, "आईडी" शून्य है और ऑब्जेक्ट "संपर्क" भर गया है। मुझे लगता है कि यह एक मॉडल बाध्यकारी मुद्दा है। आप नियंत्रक में एक को तोड़ने बिंदु डालें, तो इस अभिव्यक्ति को देखो:

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

आपको लगता है कि मूल्य मार्ग डेटा में है देखेंगे; यह सिर्फ मॉडल पर सेट नहीं हो रहा है। मेरे पास एक एक्शनफिल्टर है और यदि मैं वहां भी ब्रेक पॉइंट डालता हूं, तो मुझे लगता है कि एक्शनकॉन्टेक्स्ट के एक्शनअर्गमेंट के लिए इसकी कुंजी है, लेकिन एक शून्य मान है।

इम अभी भी शोध ...

+0

एफवाईआई, मैं भी वीएस.NET 11 बीटा का उपयोग कर रहा हूं। – craigtadlock

+0

मैंने इसे वेब एपीआई टीम में एक बग के रूप में पोस्ट किया। http://aspnetwebstack.codeplex.com/workitem/46 – craigtadlock

+0

यह वीएस.NET 11 बीटा में एक पुष्टि की गई बग है। इसे कोडप्लेक्स लिंक के स्रोत में पहले ही तय कर दिया गया है, लेकिन अभी तक कोई आधिकारिक रिलीज नहीं है। सार्वजनिक HttpResponseMessage PutMyClass (MyClass myObject) { अगर (myObject: – craigtadlock

0

craigtadlock, आपकी मदद और माइक्रोसॉफ्ट के लिए खत्म हो बग भेजने के लिए धन्यवाद। मुझे पुट्स के साथ एक ही समस्या थी। उनमें से कोई भी काम नहीं किया। कामकाज के रूप में, मैंने पुट को संभालने के लिए पोस्ट को हैक किया। यदि मैं जिस ऑब्जेक्ट को सर्वर पर पोस्ट कर रहा हूं, उसके पास पहले से ही आईडी है, तो POST कोड इसे उस आईडी के साथ PUT के रूप में मानता है। छद्म कोड है:

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

असल में बस तेह सर्वर साइड PUT हैंडलर से आईडी पैरामीटर को दूर करने के लिए बेहतर काम करता है।आईडी == 0) { // वापसी त्रुटि } else { अगर (myObject मौजूद है) // डाल किसी और कोड // वापसी NOT_FOUND कोड करते} } – Brian

संबंधित मुद्दे