编辑BadRequest

时间:2016-10-04 21:27:20

标签: c# controller request asp.net-core

我有一个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); 
        }
    );
}

2 个答案:

答案 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)