2014-04-17 9 views
7

Hallo Ich möchte Web Api-Methode von C# -Client durch meine Körpervariable in Web-API-Controller ist die ganze Zeit Null nennen. Wie man es richtig einstellt? Client-Seite:Web Api FromBody ist Null von Web-Client

IFileService imgService = new ImageServiceBll(); 
var image = System.Drawing.Image.FromFile(serverFile); 
var dataImage = imgService.ImageToBase64(image, System.Drawing.Imaging.ImageFormat.Png); 

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://site.local/"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    // HTTP POST 
    var data = new 
    { 
     imageData = dataImage, 
     version = version 
    }; 

    HttpResponseMessage response = await client.PostAsJsonAsync("api/contenttool/SaveImage", data); 
    if (response.IsSuccessStatusCode) 
    { 
     Uri gizmoUrl = response.Headers.Location; 
    } 
} 

Server Side:

public class ContentToolController : ApiController 
{ 
    public IFileService FileService { get; set; } 
    // POST api/contenttool 
    public string SaveImage([FromBody]string data) 
    { 
     JObject jObject = JObject.Parse(data); 
     JObject version = (JObject)jObject["version"]; 

     return "-OK-" + version; 
    } 
} 

Antwort

19

Ich denke, es hat mehr damit zu tun, dass Sie technisch keine Zeichenfolge übergeben. Sie übergeben eine serialisierte JSON-Zeichenfolgendarstellung eines anonymen Typs, sodass der Deserialisierungsprozess in der Web-API für Sie arbeitet. Zu dem Zeitpunkt, zu dem Ihre Anfrage an den Controller und diese Methode gelangt, ist es kein String mehr. Versuchen Sie, Ihren Typ in der SavImage-Methode dynamisch zu ändern. Wie folgt aus:

public string SavImage([FromBody]dynamic data) 
{ 
     JObject jObject = JObject.Parse(data); 
     JObject version = (JObject)jObject["version"]; 

     return "-OK-" + version; 
} 

an diesem Punkt Leider werden Sie nicht in der Lage sein, Intellisense zu verwenden, um Ihre Eigenschaften auszusteigen. Sie müssen die Daten über ein Wörterbuch aus dem dynamischen Typ herausholen.

Natürlich wäre Ihre andere Option, einen tatsächlichen Typ zu verwenden, der zwischen dem Client und dem Server geteilt wird. Das würde das ein bisschen einfacher machen.

+0

guter Punkt, aber ich fand, wenn param wie eine Zeichenkette zu PostAsJsonAsync sendet, würde es gut funktionieren. –

+1

Sie arbeiten wirklich gegen das System. Entweder die Daten als Zeichenfolge senden und als Zeichenfolge binden, ODER als JSON senden und an dasselbe Datenobjekt auf der WebAPI-Seite binden. Der zweite Weg ist der richtige Weg, es zu tun. So vermeiden Sie das Schreiben spezifischer JSON-Manipulationscodes in Ihre Aktionsmethode, das Framework ist dort für Sie. –

+0

@YishaiGalatzer Ich stimme dem größtenteils zu, aber wenn ich eine Liste von Objekten serialisieren möchte, würde ich gezwungen sein, ein neues Modell zu erstellen, einfach um eine Liste zu halten! Das scheint verrückt, oder? – Chris

1

Der String-Wert in dem Körper geführt braucht wahrscheinlich mit dem = Zeichen vorangestellt werden.

+0

Was meinst du? –

+1

Wenn Sie im Körper eine Zeichenfolge 'Hallo Welt' übergeben möchten, übergeben Sie sie als' = Hello World'. –

+0

Es sieht so aus, als ob Sie versuchen, ein JSON-Objekt an die Methode zu übergeben. Ein besserer Weg wäre ein stark typisiertes Objekt als Parameter der 'SavImage'-Methode ohne das' [FromBody] '- Attribut (das wirklich für die Übergabe einfacher Werte entworfen wurde). Die Web-API sollte sich um die Serialisierung kümmern. –

Verwandte Themen