Получение 404 при вызове метода записи в Web API - PullRequest
0 голосов
/ 20 марта 2019

У меня есть контроллер API со стандартными действиями GET, POST и Delete.

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    //Get
    [HttpPost]
    public async Task Post([FromBody] TestUser testUser, string tempPassword, role = "Guest")
    {

    }
}

Теперь я добавляю новое действие, используя:

[HttpPost]
[Route("api/[controller]/UpdateRole")]
public async Task Post(string email, List<string> roles)
{
}

Когда я пытаюсь вызвать API с помощью почтальона,

Тип: POST Конечная точка: http://localhost/api/users/UpdateRole

Тело запроса:

{
    "email":"something@mail.com",
    "roles":["S1","s3"]
}

Но я получаю 404 в ответ. На сервере я вижу,

заявка завершена без прочтения всего тела запроса.

1 Ответ

1 голос
/ 20 марта 2019

Кажется, что ваш общий маршрут равен /api/Users/api/Users/UpdateRoute из-за того, как работает RouteAttribute.

[Route("a")]
public class MyController
{
    [Route("a/b")]
    public IActionResult MyAction()
    {
    }
}

Вышеуказанный маршрут будет иметь маршрут /a/a/b, поскольку маршрут действия добавляется к маршруту контроллера.в этом случае.

Ваши варианты:

  • Измените маршрут контроллера на [Route("[controller]/[action]")] и удалите маршрут действия, и в этом случае приведенный выше пример станет /MyController/MyAction
  • Измените маршрут действия просто на [Route("b")], в этом случае полный маршрут будет a/b
  • Используйте абсолютный путь для маршрута действия [Route("/a/b")], и в этом случае маршрут контроллера будетигнорироваться, и полный маршрут будет просто /a/b.

См. здесь для получения дополнительной информации о маршрутизации.

Что касается вашей проблемы с nullВ настоящее время ASP.NET Core ожидает email и roles в качестве параметров строки запроса.Вместо этого вы должны создать модель для своего тела запроса:

public class MyModel
{
    public string Email { get; set; }
    public List<string> Roles { get; set; }
}

и затем изменить свое действие, чтобы принять его:

[HttpPost]
[Route("api/[controller]/UpdateRole")]
public async Task Post([FromBody]MyModel model)
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...