2016-07-25 10 views
0

In einer C# -Web-API versuche ich eine POST Anfrage zu akzeptieren, die ein JSON-Array enthält. Ich möchte das JSON-Array zu einem LIST oder ILISTRegisterBindingModel Klassenobjekt deserialisieren. Dann werde ich in den Controller-Aktionen über die Liste iterieren und die gewünschte Aktion ausführen.Ungültige ModelState, HTTP 400 Ungültige Anforderung für JSON-Array an C# -Web-API-Controller gesendet

Ich verwende im Wesentlichen die Aktie ASP.NET 5 Web Application Vorlage in Visual Studio 2015. Ich habe eine RegisterList Methode auf dem Account Controller hinzugefügt.

Getrennt habe ich einen Webclient in einer C# -Konsolenanwendung erstellt. Der Client sendet eine POST-Anforderung, die ein JSON-Array enthält.

Die Antwort bekomme ich immer 400 - Bad Request.

Soll ich das JSON-Array zu einer ILIST oder LIST in der Methodensignatur RegisterList deserialisieren? Ich habe versucht, JsonConverter.DeserializeObject zu verwenden, aber IntelliSenese sagt, dass the type name DeserializeObject does not exist in type JsonConverter.

Die API-Dokumentation, die mit der Visual Studio-Vorlage generiert wird, gibt an, dass das JSON-Array des Clients korrekt formatiert ist.

Im Folgenden ist der Code für die RegisterList Methode:

 // POST api/Account/RegisterList 
    [AllowAnonymous] 
    [Route("RegisterList")] 
    public async Task<IHttpActionResult> RegisterList(List<RegisterBindingModel> modelList) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     foreach (RegisterBindingModel model in modelList) 
     { 
      var user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 

      IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

      if (!result.Succeeded) 
      { 
       return GetErrorResult(result); 
      } 

     } 
     return Ok(); 
    } 

Im Folgenden ist der Code für die Kunden:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using Web_Client_Register_Account; 
using Newtonsoft.Json; 

namespace Web_Client_Register_Account 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     RunAsync().Wait(); 
    } 

    static async Task RunAsync() 
    { 
     using (var client = new HttpClient()) 
     { 
      Console.WriteLine("Hit any key"); 
      Console.ReadLine(); 
      client.BaseAddress = new Uri("http://localhost:9000/"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 





      var registrations = new List<Registration> { new Registration { Email = "[email protected]", Password = "Secrets1!", ConfirmPassword = "Secrets1!" }, new Registration { Email = "[email protected]", Password = "Secrets1!", ConfirmPassword = "Secrets1!" }, new Registration { Email = "[email protected]", Password = "Secrets1!", ConfirmPassword = "Secrets1!" }, new Registration { Email = "[email protected]", Password = "Secrets1!", ConfirmPassword = "Secrets1!" } }; 

    //HTTP Post - A JSON List in a Single POST 

      var registration_manifest = JsonConvert.SerializeObject(registrations); 

      Console.ReadLine(); 

       HttpResponseMessage response = await client.PostAsJsonAsync("api/Account/RegisterList", registration_manifest); 


       if (response.IsSuccessStatusCode) 
       { 
        Uri registrantUrl = response.Headers.Location; 
        Console.WriteLine(registrantUrl); 
        Console.ReadLine(); 
       } 
       Console.WriteLine(response); 
       Console.ReadLine(); 
     } 
    } 
} 
} 

Antwort

0

HttpClient.PostAsJsonAsync kodiert bereits zu JSON, so lassen Sie die JsonConvert.SerializeObject und nur

HttpResponseMessage response = await client.PostAsJsonAsync("api/Account/RegisterList", 
                  registrations); 
+0

Sie sind genau richtig. Ihre Lösung hat perfekt funktioniert, danke. –

Verwandte Themen