我有一个Response对象,如果控制器中有异常,我想返回给用户。但是,当我尝试发回BadRequest时,我似乎无法发送回我的Response对象。所以我的问题是如何编辑BadRequst以包含我的Response对象和/或如何使用错误状态代码发回我的Response对象?
控制器
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);
}
);
}
答案 0 :(得分:1)
你不清楚你在问什么?
您只想返回状态码400吗?使用无参数版本的return BadRequest()
想要不同的状态代码?使用不同的方法。 BadRequest
由HTTP状态码400(BadRequest)命名。如果您想自己设置状态代码,请使用return Status(HttpStatusCode.Unauthorized);
或其他。
想要以json的形式返回错误消息吗?使用错误类或匿名类来执行此操作:
return BadRequest(new { ErrorMessage = "Account is locked." });
但无论你想做什么,在Controller中抛出异常都是错误的。控制器操作应从不抛出异常。同样如评论中所指出的,例外情况将用于例外案例。错误的密码,锁定的用户或错误的身份验证方法(即,在需要时没有双因素身份验证)是预期的错误,不应通过激活处理。
异常(仅在抛出时)是计算机程序中固有的昂贵操作。出于这个原因,Microsoft实现了一个IdentityResult
类来返回预期错误列表,而不是在调用signInManager.PasswordSignInAsync
期间抛出异常
答案 1 :(得分:0)
而不是返回IActionResult
为什么不返回HttpResponseMessage
,然后你可以做以下事情:
return Request.CreateResponse(System.Net.HttpStatusCode.BadRequest)