ASP.NET Core kann Request Body nicht lesen

8

Ich habe seit einigen Wochen an ASP.NET Core gearbeitet. Ich habe versucht, etwas basierend auf diesem Blog zu erreichen: Microservices

Mein project.json ist wie folgt:

%Vor%

Und ConfigureServices Methode in Startup.cs ist wie folgt:

%Vor%

Und hier ist meine Confiure Methode in Startup.cs:

%Vor%

Ein AuthorizationController ist wie folgt:

%Vor%

Die Methode Post hatte ursprünglich [FromBody]string[] value . Ich habe es weiter vereinfacht, indem ich es zu einem einfachen string Typ gemacht habe. Ich verwende den Advance Rest Client in Chrome, um eine HTTP request zu senden. Wenn string[] der Typ I war, waren die folgenden Werte in body:

%Vor%

Nachdem ich den Parameter vereinfacht habe, habe ich versucht, eine Anfrage mit folgendem Text zu senden:

%Vor%

hat das auch versucht:

%Vor%

Vermisse ich etwas? Ich habe vorher gelesen, wie alte WebApi in Bezug auf die JSON-Zuordnung zu den komplexen Objekten und normalen Parametern funktioniert, funktioniert in .NET Core ähnlich.

Ich sollte auch ausführen, dass Haltepunkt normalerweise auf allen Middlewares und Controllern getroffen wird. Aber keine der Middleware scheint in der Lage zu sein, die Stream-bezogenen Dinge von Request zu lesen:

Bitte sag mir, wo ich Probleme mache. Vielen Dank!

    
FreshDev 18.03.2016, 11:01
quelle

6 Antworten

4

[FromBody] verwendet die registrierten Formatierer, um den gesamten Text der übermittelten Daten in den einzelnen Parameter zu decodieren, auf den sie angewendet wird. Standardmäßig akzeptiert der einzige registrierte Formatierer JSON.

In JSON gibt es keine gültige Möglichkeit, einen String direkt darzustellen - {"sdjklgsdjlg"} ist nicht gültig JSON, {"value":"sdjklgsdjlg"} ist, wird aber nicht zu einem einfachen String-Parameter deserialisiert. BEARBEITEN: Siehe die Antwort von @tmg, dies kann mit der Syntax { "": "sdjklgsdjlg" }

geschehen

Daher benötigen Sie eine bestimmte Modellklasse, um die Eingabe zu repräsentieren, die Sie vom Haupttext erhalten möchten, z. B .:

%Vor%

Dann sollten Sie erfolgreich tun können:

%Vor%

Wenn Sie nun { "Value": "some value" } veröffentlichen, sollte es das tun, was Sie erwarten.

    
Mark Hughes 18.03.2016 11:31
quelle
3

Mark Hughes Antwort ist bis zu einem gewissen Punkt corrent. Wenn Sie ein JSON dieses Formats veröffentlichen, sollte { "": "sdjklgsdjlg" } modelbinder in der Lage sein, es an ein einfaches Zeichenfolgenmodell zu binden, ohne das Wrappermodell zu benötigen.

    
tmg 18.03.2016 12:10
quelle
1

Sie können auch so etwas tun:

%Vor%

oder Benutzer [FromQuery] und übergeben Sie direkt einen Querystring-Wert.

    
Luca Ghersi 18.03.2016 11:33
quelle
1

Ich bin zu spät hier, aber ich möchte den genauen Grund teilen, damit jeder andere Benutzer genaue Informationen erhalten kann.

Sie können keine Werte auf dem Controller abrufen, da Sie Daten als JSON-Objekt veröffentlichen:

%Vor%

Um dies zu lösen, benötigen wir ein anderes Objekt, um diese Daten zu binden. So etwas bei der Aktion des Controllers:

%Vor%

hier CustomViewModel ist eine Klasse:

%Vor%

Wenn Sie Daten gemäß Ihrer aktuellen Aktionssignatur erhalten möchten:

%Vor%

Dann müssen Sie Daten als JSON-Zeichenfolge im Anfragetext übergeben:

%Vor%

Ähnlich für die String-Array-Aktion:

%Vor%

Übergeben Sie ein JSON-Array mit einer Zeichenfolge im Anfragetext:

%Vor%     
Prateek Pandey 20.05.2017 16:24
quelle
0

Sie sollten die RC2-Version all Ihrer Abhängigkeiten verwenden.
Es gibt Ссылка Ich habe festgestellt, dass die Version von System.Threading.Tasks.Extensions 4.0.0 ist Standard. Daher sollten Sie die Version dieses Pakets explizit in der Datei project.json angeben:

%Vor%     
quelle
0

Das funktioniert für mich:

%Vor%     
bc3tech 15.06.2017 17:32
quelle