2017-04-12 2 views
3

Ich erstelle eine Web-API-Methode, die ein JSON-Objekt und einen einfachen Typ akzeptieren soll. Aber alle Parameter sind immer null.JSON-Objekt und einfacher zu modellierender Typ in WebAPI mit FromBody

Mein json sieht aus wie

{ 
"oldCredentials" : { 
    "UserName" : "user", 
    "PasswordHash" : "myCHqkiIAnybMPLzz3pg+GLQ8kM=", 
    "Nonce" : "/SeVX599/KjPX/J+JvX3/xE/44g=", 
    "Language" : null, 
    "SaveCredentials" : false 
}, 
"newPassword" : "asdf"} 

Und mein Code wie folgt aussieht:

[HttpPut("UpdatePassword")] 
[Route("WebServices/UsersService.svc/rest/users/user")] 
public void UpdatePassword([FromBody]LoginData oldCredentials, [FromBody]string newPassword) 
{ 
    NonceService.ValidateNonce(oldCredentials.Nonce); 

    var users = UserStore.Load(); 
    var theUser = GetUser(oldCredentials.UserName, users); 

    if (!UserStore.AuthenticateUser(oldCredentials, theUser)) 
    { 
    FailIncorrectPassword(); 
    } 

    var iv = Encoder.GetRandomNumber(16); 
    theUser.EncryptedPassword = Encoder.Encrypt(newPassword, iv); 
    theUser.InitializationVektor = iv; 

    UserStore.Save(users); 
} 
+0

Yep, ich Postbote verwenden meine api zu testen. – Kingpin

+0

Bitte überprüfen Sie meine Antwort nach unten und lassen Sie mich wissen, ob es funktioniert oder nicht –

+0

@Kingpin, klären, wenn Asp.net-Web-API oder asp.net-Kern – Nkosi

Antwort

2

Die aktuelle JSON Sie Karten zu den folgenden Klassen

public class LoginData { 
    public string UserName { get; set; } 
    public string PasswordHash { get; set; } 
    public string Nonce { get; set; } 
    public string Language { get; set; } 
    public bool SaveCredentials { get; set; } 
} 

public class UpdateModel { 
    public LoginData oldCredentials { get; set; } 
    public string newPassword { get; set; } 
} 

[FromBody] senden kann nur einmal in Aktion verwendet werden Parameter

[HttpPut("WebServices/UsersService.svc/rest/users/user")] 
public void UpdatePassword([FromBody]UpdateModel model) { 
    LoginData oldCredentials = model.oldCredentials; 
    string newPassword = model.newPassword; 
    NonceService.ValidateNonce(oldCredentials.Nonce); 

    var users = UserStore.Load(); 
    var theUser = GetUser(oldCredentials.UserName, users); 

    if (!UserStore.AuthenticateUser(oldCredentials, theUser)) { 
     FailIncorrectPassword(); 
    } 

    var iv = Encoder.GetRandomNumber(16); 
    theUser.EncryptedPassword = Encoder.Encrypt(newPassword, iv); 
    theUser.InitializationVektor = iv; 

    UserStore.Save(users); 
} 
+0

Danke, eine Hilfe-Klasse zu erstellen, die beide kämmte, war die Lösung. Ich war daran gewöhnt, dass es möglich ist, mehr als einen Parameter zu haben. – Kingpin

+0

Es ist möglich. aber die Art, wie Sie die Daten senden und versuchen, in den Parametern zuzugreifen, stimmt nicht überein. deshalb waren sie immer null. – Nkosi

1

Mehr als ein [FromBody] nicht in Api arbeiten. Überprüfen Sie diese Microsoft Official blog

So jetzt können Sie das tun, erstellen Sie eine complex object, die sowohl Ihre oldCredentials und newPassword enthalten sollte. Zum Beispiel LoginData Klasse in meinem Beispiel unter. Und myLoginRequest ist eine andere Objektklasse, die zu deserialized Ihre LoginData ist.

[HttpPut("UpdatePassword")] 
[Route("WebServices/UsersService.svc/rest/users/user")] 
public void UpdatePassword([FromBody]LoginData MyCredentials) 
{ 
loginRequest request = JsonConvert.DeserializeObject<myLoginRequest> 
          (json.ToString()); 

// then you can do the rest 
1

Gemäß der Parameter Binding in ASP.NET Web API, "höchstens ein Parameter darf aus dem Nachrichtentext lesen". Bedeutet, dass nur ein Parameter [FromBody] enthalten kann. Also in diesem Fall wird es nicht funktionieren. Erstellen Sie ein komplexes Objekt und fügen Sie ihm die erforderlichen Eigenschaften hinzu. Sie können Ihrem komplexen Objekt newPassword hinzufügen, damit es funktioniert.

Verwandte Themen