2017-09-26 3 views
0

Ich benutze Asp.Net Core 2.0 und Web API, um einen Rest Service zu erstellen. Alles funktioniert gut außer HTTPPost.Was bewirkt, dass der Parameter null ist?

[HttpPost("LoginUser")] 
public IActionResult LoginUser(LoginUser loginUser) 
{ 
    return Ok(loginUser); 
} 

loginUser ist immer null. Ich teste mit Fiedler und mein Weg ist http://localhost:53250/api/User/LoginUser

und der Körper ist

{"EmailAddress":"[email protected]","Password":"123456789"} 

Fiddler trifft den Link ganz gut, aber Nutzlast ist immer null.

ich auch

[HttpPost("LoginUser")] 
public IActionResult LoginUser([FromBody] LoginUser loginUser) 
{ 
    return Ok(loginUser); 
} 

In diesem Fall versucht haben, ist es nicht die Funktion getroffen.

Dies ist die Definition Loginuser:

public class LoginUser 
{ 
    public string EmailAddress { get; set; } 
    public string Password { get; set; } 
} 

Irgendwelche Ideen?

+0

Getestet lokal und es funktioniert. Testen Sie es mit Postboten, wählen Sie Post, Body-> Raw und geben Sie JSON ein, es funktionierte für mich – hardkoded

+1

Beachten Sie auch, dass Sie Aktion nicht "void" sein sollte. return 'IActionResult' – Nkosi

+0

Gleiches Ergebnis mit Postman. Verwenden Sie Core 2.0? –

Antwort

0

Problem wurde gelöst. Als ich meinen UserController hinzugefügt habe, habe ich das als Klasse gemacht und vom Controller abgeleitet. Ich löschte es und fügte es als ein neues Element hinzu und wählte web api core controller. Jetzt funktioniert alles gut. Danke für Ihre Hilfe.

0

Bei der JSON-Analyse wird zwischen Groß- und Kleinschreibung unterschieden. Ihr JSON befindet sich in einem falschen Fall. Sollte sein: {"EmailAddress": "[email protected]", "Passwort": "123456789"}.

+0

Sorry, ich habe die Konvertierung von Visual Studio kopiert. Hier 'was ich von fiddler sende: {"EmailAddress": "[email protected]", "Password": "123456789"}. –

1

Ihre Aktion sollte sein:

[Route("api/[controller]")] 
public class UserController : Controller 
{ 
    [HttpPost("LoginUser")] 
    public IActionResult LoginUser([FromBody] LoginUser loginUser) 
    { 
     return Ok(loginUser); 
    } 
} 

See, [HttpPost("LoginUser")] wirkt sich nur auf Route und bezieht sich nicht auf LoginUser Objekttyp.

Update: Sie benötigen [FromBody] als ASP.NET Core model binding wird standardmäßig in [FromForm] Bindungsquelle gesucht. Und [FromBody] Attribut gibt an, dass Sie einen Parameter an Daten im Anforderungstext binden möchten.

Update 2: Sie sollten auch Content-Type: application/json Header auf Anfrage hinzufügen. ASP.NET Core wählt Eingabeformatierer basierend auf diesem Header aus.

Update 3: Wenn Sie wirklich Körperdaten als rohe Zeichenfolge benötigen, schauen Sie in ASP.NET Core MVC : How to get raw JSON bound to a string without a type?. Es schlägt vor, mit [FromBody] dynamic data

+0

Ich weiß das. Aber ich gebe das Body-Objekt mit einem gültigen LoginUser an den http-Aufruf weiter. Es ist immer noch null ... –

+0

@JohnBaird Hast du diese Lösung tatsächlich versucht? Sieht für mich richtig aus. – Brad

+0

@JohnBaird hast du 'Content-Type: application/json'-Header hinzugefügt? Du übergibst json Daten im body und hast das entsprechende Model 'LoginUser' => es ist sinnlos Body als' string' zu erwarten (wie im zweiten Beispiel: [FromBody] string loginUser). – Set

0
  • Wenn Sie Eigenschaften in Ihrer Anfrage Modell, das auf {get; private set;} gesetzt ist, werden die Werte nicht besiedelte bekommen. Machen Sie sie öffentlich, indem Sie private entfernen. Auch Konstruktoren werden nicht verwendet.

  • Wenn Sie reinen Text vom Körper lesen, sehen Sie, ob [FromForm] funktioniert.

Verwandte Themen