Почему получается 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 шт):
Уберите [action] из [Route("[controller]/[action]")] 2го контроллера и перенесите его на соответствующий метод (экшен).
UPD:
С учётом обновлённого кода в вопросе, вам нужно изменить маршрут запроса со стороны fetch. У вас сейчас указан адрес http://localhost:5134/auth/, который указывает на сам контроллер. Но у вас нет ни единого экшена с таким маршрутом. Для выполнения запроса на экшен Login вам нужно изменить маршрут запроса на http://localhost:5134/auth/login