TL; DR: Verwenden Sie nicht [FromBody], sondern rollen Sie Ihre eigene Version mit besserer Fehlerbehandlung. Gründe unten angegeben.
Andere Antworten beschreiben viele mögliche Ursachen für dieses Problem. Die Hauptursache ist jedoch, dass es [FromBody]einfach eine schreckliche Fehlerbehandlung gibt, die es im Produktionscode fast unbrauchbar macht.
Einer der typischsten Gründe für den Parameter nullist beispielsweise, dass der Anforderungshauptteil eine ungültige Syntax aufweist (z. B. ungültiges JSON). In diesem Fall würde eine vernünftige API zurückkehren 400 BAD REQUEST, und ein vernünftiges Webframework würde dies automatisch tun. Die ASP.NET-Web-API ist in dieser Hinsicht jedoch nicht sinnvoll. Es setzt einfach den Parameter auf nullund der Anforderungshandler benötigt dann "manuellen" Code, um zu überprüfen, ob der Parameter ist null.
Viele der hier gegebenen Antworten sind daher in Bezug auf die Fehlerbehandlung unvollständig, und ein fehlerhafter oder böswilliger Client kann auf der Serverseite unerwartetes Verhalten verursachen, indem er eine ungültige Anfrage sendet, die (im besten Fall) eine NullReferenceExceptionirgendwo auslöst und eine falsche zurückgibt Status von 500 INTERNAL SERVER ERRORoder, schlimmer noch, etwas Unerwartetes tun oder abstürzen oder eine Sicherheitslücke aufdecken.
Eine geeignete Lösung wäre, ein benutzerdefiniertes " [FromBody]" Attribut zu schreiben , das die ordnungsgemäße Fehlerbehandlung durchführt und die richtigen Statuscodes zurückgibt, idealerweise mit einigen Diagnoseinformationen, um Cliententwicklern zu helfen.
Eine Lösung, die möglicherweise hilft (noch nicht getestet), besteht darin, die erforderlichen Parameter wie folgt festzulegen : https://stackoverflow.com/a/19322688/2279059
Die folgende ungeschickte Lösung funktioniert auch:
public HttpResponseMessage MyAction([FromBody] JObject json)
{
if (json == null) {
var response = new HttpResponseMessage(HttpStatusCode.BadRequest) {
ReasonPhrase = "Invalid JSON"
};
throw new HttpResponseException(response);
}
MyParameterModel param;
try {
param = json.ToObject<MyParameterModel>();
}
catch (JsonException e) {
var response = new HttpResponseMessage(HttpStatusCode.BadRequest) {
ReasonPhrase = String.Format("Invalid parameter: {0}", e.Message)
};
throw new HttpResponseException(response);
}
}
Dies führt (hoffentlich) zu einer ordnungsgemäßen Fehlerbehandlung, ist jedoch weniger deklarativ. Wenn Sie beispielsweise Swagger zum Dokumentieren Ihrer API verwenden, ist der Parametertyp nicht bekannt. Dies bedeutet, dass Sie eine manuelle Problemumgehung finden müssen, um Ihre Parameter zu dokumentieren. Dies soll nur veranschaulichen, was [FromBody]zu tun ist.
BEARBEITEN: Eine weniger umständliche Lösung ist zu überprüfen ModelState: https://stackoverflow.com/a/38515689/2279059
BEARBEITEN: Es scheint, dass ModelState.IsValides nicht wie erwartet auf gesetzt ist, falsewenn JsonPropertymit verwendet wird Required = Required.Alwaysund ein Parameter fehlt. Das ist also auch nutzlos.
Meiner Meinung nach ist jedoch jede Lösung, die das Schreiben von zusätzlichem Code in jeden Anforderungshandler erfordert, nicht akzeptabel. In einer Sprache wie .NET mit leistungsstarken Serialisierungsfunktionen und in einem Framework wie der ASP.NET-Web-API sollte die Anforderungsüberprüfung automatisch und integriert sein und ist vollständig machbar, obwohl Microsoft nicht die erforderlichen integrierten Funktionen bereitstellt Werkzeuge.