Почему Json не передается в контроллер?? C# Asp.Net Core 3.1

Код контроллера (к примеру):

public async Task<string> Login(LoginModel model)
{
    return model.Email;
}

Код LoginModel:

public class LoginModel
{
    [JsonPropertyName("Email")]
    public string Email { get; set; }

    [JsonPropertyName("Password")]
    public string Password { get; set; }
}

Отправляю вот так:

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://localhost:44345");
HttpContent hs = new StringContent("{\"Email\":\"[email protected]\",\"Password\":\"password\"} ", Encoding.UTF8, "application/json");
var response = client.PostAsync("Auth/Login", hs).Result;

В ответ получаю то, что вместо данных в Json попадают Null. Думал на счет того, чтобы передавать в void Login(string json), но тогда мне получается нужно будет отправлять Key "json" Value "Сам json", чего мне не хотелось бы делать... Или я что-то не так понимаю или дико с чем-то туплю.

Использовать x-www-form-urlencoded я умею, но мне нужно именно json.


Ответы (1 шт):

Автор решения: A K

У меня есть проект созданный из совершенно типового шаблонного проекта webapi (тот где по умолчанию подставляется ValueController, думаю видели), я на нём много экспериментировал с биндингами.

Вот полный пример.

Так должен выглядеть код контроллера:

using Microsoft.AspNetCore.Mvc;

namespace WebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AsdfController : ControllerBase
    {
        [HttpPost]
        public ActionResult<string> Method([FromBody] Request request)
        {
            return $"post, value1={request.Value1}, value2={request.Value2}.";
        }
    }

    public class Request
    {
        public int Value1 { get; set; }

        public string Value2 { get; set; }
    }
}

Вот так код клиента в linqpad:

void Main()
{
    var unit = new WebRequestHelper();

    // Post samples as json

    unit.PostAsync("https://localhost:44323/api/asdf", "{\"Value1\":5,\"Value2\":\"asdf\"}")
        .Result.Dump(); // Expected: post, value1=5, value2=asdf.

    unit.PostAsync("https://localhost:44323/api/asdf", JsonConvert.SerializeObject(new { Value1 = 1, Value2 = "asdf", }))
        .Result.Dump(); // Expected: post, value1=5, value2=asdf.
        
    // Free for your samples
}

И сам хелпер:

public class WebRequestHelper
{
    public async Task<string> PostAsync(string uri, string jsonString)
    {
        var client = new HttpClient();
        var content = new StringContent(jsonString, Encoding.UTF8, "application/json");     
        var response = await client.PostAsync(uri, content);
        return await response.Content.ReadAsStringAsync();
    }
}

Пробуйте, вам в комментариях всё верно отписали, осталось только сложить аккуратно всё воедино. Модель свою подставите вместо анонимной, там просто обычный класс с геттерами и сеттерами. Можете даже убрать атрибуты JsonPropertyName они в вашем случае избыточны, т.к. конвенциональны.

→ Ссылка