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); 
        }
    );
}

Edit BadRequest

不太清楚你在问什么?

你只想返回状态码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)