WebAPI POST funktioniert ohne [FromBody]?

8

Ich habe diese Controller-Aktion:

%Vor%

Wo Z ist:

%Vor%

Aber wenn ich über fiddler poste:

%Vor%

Ich kann tatsächlich sehen, dass es funktioniert:

Frage:

Wenn ja, wie funktioniert es ohne das Attribut [FromBody]? und brauche ich dieses Attribut noch / schreibe es nicht?

Was ist das Szenario, in dem dieses Attribut nicht geschrieben wird - Probleme?

    
Royi Namir 22.11.2014, 09:53
quelle

1 Antwort

12

Die Bindung ist für die MVC- und Web-API unterschiedlich. Standardmäßig bindet die ASP.NET-Web-API komplexe Typen aus dem Nachrichtentext der Anforderung und einfache Typen aus URI, Abfragezeichenfolge usw. Da Sie Z angegeben haben, was eine Klasse (komplexer Typ) ist, füllt sie den Parameter action method aus Körper, ohne dass Sie [FromBody] angeben müssen. Auf der anderen Seite, wenn Ihre Anfrage http://localhost:11485/api/profiles/aaa?a=1 ohne Körper ist, wird sie NICHT automatisch an Ihren komplexen Parameter gebunden. In diesem Fall müssen Sie [FromUri] wie folgt angeben: public HttpResponseMessage aaa([FromUri]Z z) .

Sagen Sie andererseits, Ihre Aktionsmethode ist public HttpResponseMessage aaa(string a) . Wir haben jetzt string , was ein einfacher Typ ist. In diesem Fall lässt http://localhost:11485/api/profiles/aaa?a=1 ohne einen Nachrichtentext die Web-API den Parameter korrekt binden, ohne dass Sie [FromUri] angeben müssen. Wenn Sie in diesem Fall vom Körper binden möchten, müssen Sie public HttpResponseMessage aaa([FromBody]string a) angeben. Natürlich muss für diesen Körper =1 , für application/x-www-form-urlencoded , ohne den Schlüsselnamen a sein.

Untere Zeile - Ihr Parameter (einfacher Typ oder komplexer Typ) bestimmt, wie die Web-API bindet. Damit es anders als das Standardverhalten funktioniert, müssen Sie über FromUri oder FromBody sagen.

PS. Alles, was ich oben erwähnt habe, gilt nur für die gute alte ASP.NET Web API (einschließlich 2). In ASP.NET 5.0 a.k.a ASP.NET vNext oder ASP.NET MVC 6.0 wurden MVC und Web API vereinheitlicht. Um einen komplexen Typ aus dem body zu binden, müssen Sie [FromBody] angeben.

    
Badri 22.11.2014, 14:17
quelle

Tags und Links