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

130
17 апреля 2022, 15:10

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

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\":\"mail@mail.ru\",\"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.

Answer 1

У меня есть проект созданный из совершенно типового шаблонного проекта 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 они в вашем случае избыточны, т.к. конвенциональны.

READ ALSO
Visual Studio 2019 Professional не видит установленный ASP.NET .NET Framework

Visual Studio 2019 Professional не видит установленный ASP.NET .NET Framework

На машине x64 Windows 7 установил MS VS 2019 Professional, вместе установил и "ASPNET

125
Как хранить графики работы?

Как хранить графики работы?

Пишу программу вывода графика работы врачей на телевизорГрафик работы сохраняю в БД

109
Ошибка при вызове дженерик класса

Ошибка при вызове дженерик класса

Есть статический класс с дженериком

162
Как убрать трение в Unity2D?

Как убрать трение в Unity2D?

Чтобы убрать трение при столкновении со стенами я добавлял колайдеру персонажа физический материал и в нём убирал Friction на 0, но из-за отсутсвия...

128