2013-10-26 4 views
8

Ich versuche, ein C# -Objekt an einen Web-API-Controller zu übergeben. Die API ist zum Speichern von Objekten vom Typ Produkt konfiguriert, die auf sie gebucht werden. Ich habe erfolgreich Objekte mit der Jquery Ajax-Methode hinzugefügt und jetzt versuche ich, das gleiche Ergebnis in C# zu bekommen.C# -Objekt an Webapi-Controller senden

Ich habe eine einfache Konsolenanwendung erstellt ein Gesuch an die api senden:

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; } 
    public decimal Price { get; set; } 
} 

     static void Main(string[] args) 
    { 
     string apiUrl = @"http://localhost:3393/api/products"; 
     var client = new HttpClient(); 
     client.PostAsJsonAsync<Product>(apiUrl, new Product() { Id = 2, Name = "Jeans", Price = 200, Category = "Clothing" }); 

    } 

Die postproduct Methode nie aufgerufen wird, wie dieses Objekt an die Steuerung zu senden?

Methode für das Hinzufügen von Elementen verwendet:

public HttpResponseMessage PostProduct([FromBody]Product item) 
    { 
     item = repository.Add(item); 
     var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item); 

     string uri = Url.Link("DefaultApi", new { id = item.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
+0

Ihr Code scheint in Ordnung, was siehst du in Fiddler? Haben Sie die Webapi-Ablaufverfolgung auf dem Server aktiviert? –

+0

Ich kann Anfragen sehen, die von einem Formular stammen, das ich verwende. Keine vom HttpClient gesendeten Anfragen sind in Fiddler sichtbar. Ich habe auch die API auf http://producttestapi.azurewebsites.net/api/products hochgeladen, aber keine der Anfragen vom HttpClient erreichen diese API auch nicht. – neo112

+0

Überprüfen Sie auch die index.html dieser URL, das ist die Form, die ich benutze, um Objekte durch Ajax zu senden, dass man funktioniert, damit die API in Ordnung ist. – neo112

Antwort

16

Sieht aus wie Sie irgendwie JSON als Format zu akzeptieren für die Buchung deaktiviert haben. Ich war in der Lage, die Daten an Ihren Endpunkt zu senden und ein neues Produkt mit application/x-www-form-urlencoded zu erstellen. Das ist wahrscheinlich, wie Ihre jQuery-Anfrage es tut.

Können Sie Ihren Konfigurationscode Ihrer Web-API anzeigen? Ändern Sie die Standardformatierer?

Oder Sie könnten ein Formular von HttpClient senden. z.B.

string apiUrl = "http://producttestapi.azurewebsites.net/api/products"; 
    var client = new HttpClient(); 
    var values = new Dictionary<string, string>() 
     { 
      {"Id", "6"}, 
      {"Name", "Skis"}, 
      {"Price", "100"}, 
      {"Category", "Sports"} 
     }; 
    var content = new FormUrlEncodedContent(values); 

    var response = await client.PostAsync(apiUrl, content); 
    response.EnsureSuccessStatusCode(); 
+0

Die Ajax-Methode hat 'dataType: "json"' definiert. Das führt mich zu der Annahme, dass der Controller JSON weiterhin als Daten akzeptiert. Ich habe die Methode hinzugefügt, die das Hinzufügen neuer Objekte zur Liste behandelt. Ich würde den Konfigurationscode zeigen, ist es eine CS-Datei aus dem Ordner App_Start? In der Zwischenzeit versuchen Sie die Approuch, die Sie hier gepostet haben. – neo112

+0

Ich konnte die PostAsJson-Methode auch mit dem von Ihnen angegebenen Code verwenden und jetzt funktioniert es. Vielen Dank, mein Herr! – neo112

+0

Was können wir tun, wenn wir einen Parameter wie String-Array in der Klasse haben. Ich kann es nicht auf das Dictionary festlegen, da FormUrlEncodedContent kein Dictionary akzeptiert – Yasitha