簡體   English   中英

無效的ModelState,發送給C#Web API控制器的JSON數組的HTTP 400錯誤請求

[英]Invalid ModelState, HTTP 400 Bad Request for JSON Array Sent to C# Web API Controller

在C#Web API中,我試圖接受包含JSON數組的POST請求。 我想將JSON數組反序列ILIST RegisterBindingModel類對象的LISTILIST 然后,在控制器動作中,我將遍歷列表並執行所需的動作。

我基本上在Visual Studio 2015中使用庫存ASP.NET 5 Web應用程序模板。我在Account控制器上添加了RegisterList方法。

另外,我在C#控制台應用程序中創建了一個Web客戶端。 客戶端發送包含JSON數組的POST請求。

我得到的響應始終是400-錯誤請求。

我是否應該在RegisterList方法簽名中將JSON數組反序列化為ILIST或LIST? 我嘗試使用JsonConverter.DeserializeObject ,但是IntelliSenese說the type name DeserializeObject does not exist in type JsonConverter

使用Visual Studio模板生成的API文檔表明客戶端的JSON數組格式正確。

以下是RegisterList方法的代碼:

        // 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();
    }

以下是客戶端的代碼:

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 = "orc@coast2coast.net", Password = "Secrets1!", ConfirmPassword = "Secrets1!" }, new Registration { Email = "gargoyle@coast2coast.net", Password = "Secrets1!", ConfirmPassword = "Secrets1!" }, new Registration { Email = "elf@coast2coast.net", Password = "Secrets1!", ConfirmPassword = "Secrets1!" }, new Registration { Email = "ranger@coast2coast.net", 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();
        }
    }
}
}

HttpClient.PostAsJsonAsync已經編碼為JSON,因此跳過JsonConvert.SerializeObject並僅

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM