我实现了一个IUserRepository
,在我的UserRepository
中实现了登录和注册;这是我的代码
public async Task<IActionResult> LoginAsync([FromBody] UserCred user)
{
var result = await _signInManager.PasswordSignInAsync(user.username, user.password, user.rememberMe, false);
if (result.Succeeded)
{
var token = _jwtAuthenticationManager.Authenticate(user.username, user.password);
if (token == null)
return Unauthorized();
return Ok(token);
}
return BadRequest();
}
然而,我得到了一个错误:
;BadRequest";在当前上下文中不存在
与Ok
和Unauthorized
相同。
然而,当我在userController
中直接实现这些调用时,我并没有遇到这个问题。我想我只能在控制器中返回BadRequest
?有什么办法可以克服这个问题吗?因为如果不是IActionResult
,我将如何检查results.Succeeded
?
此外,这是我的UserController
:
[HttpPost]
[AllowAnonymous]
[Route("login")]
public async Task<IActionResult> Login([FromBody] UserCred user)
{
return await _userRepository.LoginAsync(user);
}
BadRequest()
是控制器本身的一种方法。
最好从IUserRepository
返回一个值,例如null或token,然后在控制器中将该值映射到Ok
或BadRequest
响应
控制器自己负责决定响应类型
放置在控制器中的类似代码应该完成任务:
token = await _userRepository.LoginAsync(user);
return token == null ? BadRequest() : Ok(token);
可以通过返回EG.
new BadRequestObjectResult("some error");
但是,你不应该在存储库中做任何与网络相关的事情
相反,您应该从存储库中抛出一个适当的异常,并在控制器中捕获它。然后,当您捕捉到异常时,从那里返回BadRequest。
此外,请确保您返回的是正确的响应。
BadRequest意味着请求有问题——可能用户名或密码为null等。甚至在尝试访问存储库之前,都应该检查这一点。
如果身份验证失败,未经授权可能是更好的响应。
然后,如果真的有错误,不要隐藏它,当你有很多无法调试的端点时,它会在以后引起问题,返回500响应(但不包括生产中的异常详细信息(