Почему получается HttpStatusCode 404 при запросе через fetch на контроллер asp.net core web api?

Проект .Net Core Web API + React Next js.

Первый контроллер имеет атрибут [Route("[controller]")], методы связываются с ним например таким образом await fetch("http://localhost:5134/orders/", всё работает.

Сделал 2‑й контроллер для аутентификации, лежит в той же папке. У контроллера атрибут [Route("[controller]/[action]")], атрибуты экшена [AllowAnonymous] и [HttpPost("login")].

Swagger работает корректно, но с клиента не могу достучаться до экшена. При попытке отправить данные из формы:

await fetch("http://localhost:5134/auth/login"

Получаю ошибку POST http://localhost:5134/auth/login/ net::ERR_ABORTED 404 (Not Found).

Program.cs:

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddAuthentication;
...
app.MapControllers();

Контроллер

namespace Versta.API.Controllers
{
[ApiController]
[Route("[controller]")]  //[action]
public class AuthController : ControllerBase
{
    private readonly IAuthService _authService;

    public AuthController(IAuthService authService)
    {
        _authService = authService;
    }

    [Route("Register")]
    [AllowAnonymous]
    [HttpPost]
    public async Task<IActionResult> Register([FromBody] RegisterRequest request)
    {
        if (String.IsNullOrEmpty(request.UserName))
        {
            return BadRequest(new { message = "User name needs to entered" });
        }
        else if (String.IsNullOrEmpty(request.Password))
        {
            return BadRequest(new { message = "Password needs to entered" });
        }

        User userToRegister = new(request.UserName, request.Password);

        User loggedInUser = await _authService.Register(request.UserName!, request.Password);

        if (loggedInUser != null)
        {
            return Ok(loggedInUser);
        }

        return BadRequest(new { message = "User registration unsuccessful" });
    }


    [Route("Login")]
    [AllowAnonymous]
    [HttpPost]
    public async Task<IActionResult> Login([FromBody] LoginRequest request)
    {
        if (String.IsNullOrEmpty(request.UserName))
        {
            return BadRequest(new { message = "Email address needs to entered" });
        }
        else if (String.IsNullOrEmpty(request.Password))
        {
            return BadRequest(new { message = "Password needs to entered" });
        }

        User loggedInUser = await _authService.Login(request.UserName, request.Password);

        if (loggedInUser != null)
        {
            return Ok(loggedInUser);
        }

        return BadRequest(new { message = "User login unsuccessful" });
    }

}

Код запроса

export const loginUser = async (userLoginRequest: UserLoginRequest) => {
await fetch("http://localhost:5134/auth/", {    //login/
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache',
    },
    body: JSON.stringify(userLoginRequest)
});

Ошибка на строке с fetch.


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

Автор решения: Faraday

Уберите [action] из [Route("[controller]/[action]")] 2го контроллера и перенесите его на соответствующий метод (экшен).

UPD: С учётом обновлённого кода в вопросе, вам нужно изменить маршрут запроса со стороны fetch. У вас сейчас указан адрес http://localhost:5134/auth/, который указывает на сам контроллер. Но у вас нет ни единого экшена с таким маршрутом. Для выполнения запроса на экшен Login вам нужно изменить маршрут запроса на http://localhost:5134/auth/login

→ Ссылка