ASP.NET Core 2.2 - ошибка метода CreatedAtRoute для сложных маршрутов - PullRequest
1 голос
/ 01 июля 2019

У меня есть AuthController, который я хочу использовать метод CreatedAtRoute для запуска действия в UsersController для возврата вставленного пользователя, но он выдает эту ошибку:

InvalidOperationException: No route matches the supplied values.

Здесь показан AuthController. Пользователь регистрируется и после успешной регистрации вызывается действие GetUser UsersController:

[Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        private readonly IConfiguration _config;
        private readonly ITokenService _tokenService;
        private readonly IMapper _mapper;
        private readonly UserManager<User> _userManager;
        private readonly IUserService _userService;
        private readonly SignInManager<User> _signInManager;
        private readonly ILogger _logger;

        public AuthController(IConfiguration config,
           ITokenService tokenService,
           IMapper mapper,
           UserManager<User> userManager,
           SignInManager<User> signInManager,
           IUserService userService,
           ILogger<AuthController> logger)
        {
            _tokenService = tokenService;
            _userManager = userManager;
            _signInManager = signInManager;
            _mapper = mapper;
            _config = config;
            _userService = userService;
            _logger = logger;
        }
        [AllowAnonymous]
        [HttpPost("register")]
        public async Task<IActionResult> Register([FromBody]UserForRegisterDto userForRegisterDto)
        {
            _logger.LogInformation(LoggingEvents.InsertItem, "Registering user {UserName}", userForRegisterDto.UserName);
            var userToCreate = _mapper.Map<User>(userForRegisterDto);

            var result = await _userManager.CreateAsync(userToCreate,"1234567a" /*userForRegisterDto.Password*/);

            var userToReturn = _mapper.Map<UserForLoginReturnDto>(userToCreate);

            if (result.Succeeded)
            {
                _logger.LogInformation(LoggingEvents.InsertItem, "Registering user {UserName}", userForRegisterDto.UserName);
                return CreatedAtRoute("GetUser",
                    new { controller = "Users", id = userToCreate.Id }, userToReturn);
            }
            _logger.LogError(LoggingEvents.InsertItem, "Registering user failed: {UserName}", userForRegisterDto.UserName);
            return BadRequest(result.Errors);
        }
}

А UsersController выглядит так:

[Route("api/users/{userId}/users")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly IUserService _userService;
        private readonly IMapper _mapper;
        private readonly UserManager<User> _userManager;
        public UsersController(IUserService userService,
            UserManager<User> userManager,
            IMapper mapper)
        {
            _userService = userService;
            _userManager = userManager;
            _mapper = mapper;
        }


        [Authorize(Roles = "Admin, Manager, User")]
        [HttpGet("{id}", Name = "GetUser")]
        public async Task<IActionResult> GetUser(int id)
        {
            var isCurrentUser = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value) == id;

            var user = await _userService.GetUser(id, isCurrentUser);

            var userToReturn = _mapper.Map<UserForLoginReturnDto>(user);

            return Ok(userToReturn);
        }
}

Как обратиться к UsersController в методе CreatedAtRoute?

1 Ответ

2 голосов
/ 01 июля 2019

Это проблема маршрутизации. Вам не хватает значения для целевого маршрута

return CreatedAtRoute("GetUser", new { id = userToCreate.Id, userId = {some value here} }, userToReturn);
...