2016-11-17 6 views
1

Ich habe eine einfache Web-API, aber wenn ich es mit Postman testen, ist der Methodenparameter null. Ich habe über andere Fragen mit ähnlichem Titel gesucht, aber ich habe keine Antwort gefunden.Web API: Aktionsparameter ist Null

Hier ist mein Controller-Aktion:

[HttpPost] 
    public Member Create([FromBody] string payload) 
    { 
     var s = Request.Content.ReadAsStringAsync(); 

     if (payload == null) 
     { 
      throw new ArgumentNullException(nameof(payload)); 
     } 

     Console.WriteLine(payload); 
     Console.WriteLine(s); 

     return null; 
    } 

Und hier ist mein Postbote Konfiguration: enter image description here

Im Header Tab I content-type hinzugefügt haben application/json zu sein.

, wenn ich das Debuggen bin, die payload Variable ist immer null und der String s enthält so etwas wie

Id = 98, Status = RanToCompletion, Method = "{null}", Result = "" 

Also, was mache ich falsch?

+1

Was passiert, wenn Sie nur eine Zeichenfolge (kein JSON) in den Körper einfügen? – Donal

+0

Lesen Sie dies und Sie werden dort, wo Sie den Fehler mit der Parameterbindung gemacht haben. [Parameterbindung in ASP.NET Web API] (https://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api) Der andere Fehler ist, dass Sie die Aufgabe und nicht das Ergebnis der Aufgabe ausgeben, wenn Sie versuchen, den Inhalt als Zeichenfolge zu lesen – Nkosi

+0

@Donal Wenn ich eine einfache Zeichenfolge, funktioniert es. Aber warum? –

Antwort

0

Sie Ihre Zeichenfolge in Modell wickeln sollte (Objekt):

class Model 
{ 
    public string payload {get;set;} 
} 

[HttpPost] 
public async Task<Member> Create([FromBody] Model model) // wrap Member in Task and add async keyword 
{ 
    var s = await Request.Content.ReadAsStringAsync(); // add await here 

    if (model.payload == null) 
    { 
     throw new ArgumentNullException(nameof(model.payload)); 
    } 

    Console.WriteLine(model.payload); 
    Console.WriteLine(s); 

    return null; 
} 

Wenn Sie nicht wollen, Modell verwenden, versuchen Sie, nur einfache Zeichenfolge, wie "some payload" zu senden, wickeln Sie es nicht in json.

+0

zu füllen aber warum? Ich sehe nicht die Logik –

+0

@BudaGavril basierend auf Ihrem Postboten der Körper der Anfrage zeigt, dass Sie ein JSON-Objekt (komplexes Modell) senden, nicht eine Zeichenfolge, die die Aktion erwartet – Nkosi

+0

@BudaGavril, weil 'Json' braucht Modell im Controller. Sie senden 'json', keine einfache' string' –

1

Buda,

HttpContent.ReadAsStringAsync gibt ein Task<string>, daher den Wert des s String.

Sie haben Ihre Aktion zu aktualisieren, es zu machen Asynchron:

[HttpPost] 
public async Task<Member> Create([FromBody] string payload) 
{ 
    var s = await Request.Content.ReadAsStringAsync(); 

    if (payload == null) 
    { 
     throw new ArgumentNullException(nameof(payload)); 
    } 

    Console.WriteLine(payload); 
    Console.WriteLine(s); 

    return null; 
} 
+0

Ich habe den Code aktualisiert und erwarte, aber meine s-Variable enthält String.Empty –

+0

's' ist leer, da der Content-Stream-Zeiger bereits am Ende des Streams ist, da das Framework es bereits gelesen hat versucht, den Parameter – Nkosi

Verwandte Themen