2016-10-18 5 views
0

Ich habe eine Controller-Methode wie folgt erklärt:POSTed Json Körper benötigt Zitate rund um

[HttpPost] 
public override IHttpActionResult Post([FromBody]string data) 
{ 
    // do stuff 
} 

Wenn mit Advanced REST-Client zu testen, oder Powershell, finde ich, dass meine Json Körper durch einfache Anführungszeichen umgeben werden müssen. Beispiel: statt

{"name":"Elroy", "age":99} 

I

'{"name":"Elroy", "age":99}' 

Wenn nicht in Anführungszeichen zu bieten haben, die meine Methode für die "Daten" Parm einen leeren Wert erhält.

Mein ARC Client DOES content-type = "application/json"

angeben, das ist nicht richtig, oder? Die äußeren Zitate sollten nicht nötig sein, oder?

Antwort

0

Das ist richtig, weil JSON als String über die Leitung übertragen wird, nicht als Objektgraph. Daher müssen die Anführungszeichen angeben, dass es sich um eine Zeichenfolge handelt.

+0

Also ich denke, um die Quote Anforderung zu vermeiden, konnte ich die Parm-off der Methodendeklaration und Zugriff auf den Körper durch Lesen des Anfrage-Stream. –

+0

Offensichtlich ist es möglich, JSON-Inhalte zu posten, ohne sie zu zitieren. Auch wenn es nicht in Anführungszeichen steht, wird es im Anforderungsstream angezeigt. Das Problem besteht darin, dass .net mvc es nicht einem Parameter vom Typ string zuordnet, der als [FromBody] markiert ist, es sei denn, es wird in Anführungszeichen gesetzt. Unsere Lösung bestand darin, ein neues Attribut [JsonStringFromBody], abgeleitet von ParameterBindingAttribute, zu erstellen, das anstelle von [FromBody] verwendet wird. Das neue Attribut liest den Datenstrom aus dem Anforderungsobjekt und gibt den Text als Zeichenfolge zurück, wodurch die Methodenzuordnung ermöglicht wird. Es scheint ein Fehler zu sein, dass [FromBody] das nicht macht. –

+0

@ElroyFlynn das ist wahr, wenn Sie es über das Request-Objekt erhalten, können Sie es in dem gewünschten Format POST, sofern Sie es am anderen Ende entschlüsseln können. Wenn Ihre auf Attributen basierende Lösung Ihre ursprüngliche Frage beantwortet, sollten Sie eine Antwort erstellen und akzeptieren, damit andere sie sehen können, wenn sie auf diese Frage stoßen. –