Edit BadRequest
本文关键字:BadRequest Edit | 更新日期: 2023-09-27 18:11:27
我有一个Response对象,如果控制器中出现异常,我希望将该对象返回给用户。然而,当我试图发送回BadRequest我似乎不能发送回我的响应对象。所以我的问题是我如何编辑badrequest来包含我的响应对象和/或我如何用错误状态码发送回我的响应对象?
控制器public async Task<IActionResult> Login([FromBody] LoginViewModel model) {
Response response = new Response();
try {
if (ModelState.IsValid) {
var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded) {
logger.LogInformation(1, "User logged in.");
return Json("User logged in.");
}
if (result.RequiresTwoFactor) {
response.id = 1 ;
throw new LoginException("Login requiest two factor", new InvalidOperationException());
}
if (result.IsLockedOut) {
response.id = 2 ;
logger.LogWarning(2, "User account locked out.");
throw new LoginException("User account locked out", new InvalidOperationException());
}
else {
response.id = 3 ;
throw new LoginException("Invalid login attempt", new InvalidOperationException());
}
}
response.id = 4 ;
var modelErrors = ModelState.Values.ToList();
throw new LoginException("Model State Error", ModelState, new InvalidOperationException());
} catch (LoginException ex){
return BadRequest(response); // response with status: 400 Bad Request for URL, no response object is in here.
}
}
前端login(email:any, password:any, remember:any){
//let body:User = {email:email, password:password};
let headers = new Headers({ 'Content-Type': 'application/json' });
let body = {Email:email, Password:password,RememberMe:false };
console.log(body);
this.http.post('/api/Account/Login', body ,{headers:headers})
.map(response => response.json())
.subscribe(
response => {
console.log("Success !!!:'n"+response);
this.router.navigate(['/home']);
},
error => {
console.log("Error !!!:'n"+error);
}
);
}
不太清楚你在问什么?
你只想返回状态码400?使用return BadRequest()
的无参数版本
想要一个不同的状态码?使用不同的方法。BadRequest
由HTTP状态码400 (BadRequest)命名。如果你想设置自己的状态码,使用return Status(HttpStatusCode.Unauthorized);
或其他。
想要返回json格式的错误信息?使用错误类或匿名类来实现:
return BadRequest(new { ErrorMessage = "Account is locked." });
但是无论你想做什么,在Controller中抛出异常都是错误的。控制器动作应该永远不要抛出异常。正如注释中指出的,异常将用于异常情况。错误的密码,锁定的用户或错误的身份验证方法(即,当需要时没有双因素验证)是预期的错误,不应该通过异常处理。
异常(仅当被抛出时)本质上是计算机程序中昂贵的操作。出于这个原因,Microsoft实现了一个IdentityResult
类来返回预期错误的列表,而不是在调用signInManager.PasswordSignInAsync
不是返回IActionResult
,为什么不返回HttpResponseMessage
,然后你可以这样做:return Request.CreateResponse(System.Net.HttpStatusCode.BadRequest)