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 ILIST
RegisterBindingModel
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();
}
}
}
}
Sie sind genau richtig. Ihre Lösung hat perfekt funktioniert, danke. –