Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编辑坏请求_C#_Controller_Request_Asp.net Core - Fatal编程技术网

C# 编辑坏请求

C# 编辑坏请求,c#,controller,request,asp.net-core,C#,Controller,Request,Asp.net Core,我有一个响应对象,如果控制器中存在异常,我希望将其返回给用户。然而,当我试图发回错误请求时,我似乎无法发回我的响应对象。因此,我的问题是如何编辑BadRequst以包含我的响应对象和/或如何发回带有错误状态代码的响应对象 控制器 public async Task<IActionResult> Login([FromBody] LoginViewModel model) { Response response = new Response(); try {

我有一个响应对象,如果控制器中存在异常,我希望将其返回给用户。然而,当我试图发回错误请求时,我似乎无法发回我的响应对象。因此,我的问题是如何编辑BadRequst以包含我的响应对象和/或如何发回带有错误状态代码的响应对象

控制器

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. 
    }
}

与其返回
IActionResult
不如返回
HttpResponseMessage
然后执行以下操作:
return Request.CreateResponse(System.Net.HttpStatusCode.BadRequest)

不太清楚你在问什么

您只想返回状态代码400?使用无参数版本的
return BadRequest()

想要一个不同的状态码吗?使用不同的方法
BadRequest
由HTTP状态码400(BadRequest)命名。如果您想自己设置状态代码,请使用
返回状态(HttpStatusCode.Unauthorized)或其他什么

要以json形式返回错误消息吗?使用错误类或注释类执行此操作:

return BadRequest(new { ErrorMessage = "Account is locked." });
但无论您想做什么,在控制器中抛出异常都是错误的。控制器操作应从不引发异常。同样如评论中所指出的,例外情况也适用于例外情况。错误的密码、锁定的用户或错误的身份验证方法(即在需要时没有双因素身份验证)是预期的错误,不应通过Exceptions进行处理


异常(仅在抛出时)是计算机程序中固有的昂贵操作。因此,Microsoft实现了一个
IdentityResult
类来返回预期错误的列表,而不是在调用
signInManager.PasswordSignInAsync

时抛出异常。BadRequest类是如何定义的?另外,我建议您不要立即抛出异常并捕获它们,只需返回您的BadRequest(响应)。BadRequest是控制器类的助手方法,它已经暗示了一个状态代码:HTTP代码400(BadRequest),因此得名。另外,您不应该在控制器中抛出异常,而是返回IActionResult。您正在滥用异常来生成错误结果。例外就是这个名字所说的:异常错误。用户锁定或输入验证并不例外,但expectedreturn BadRequest(new{ErrorMessage=“Account is locked。”});。在conolse中,我没有看到帐户被锁定的消息。但这正是我想要做的。控制台上显示错误!!!:响应状态为:400错误的URL请求:“这不是在日志中打印,而是返回给浏览器的内容。因此,如何从浏览器中获取消息?取决于您如何使用它。如果您有一个javascript客户端,请解析它并将其显示给用户。如果您使用.NET或Java客户端,请在那里执行相同的操作。这就是rest服务返回的结果。消费者如何使用它取决于消费者。您以前是否使用过web技术?似乎你对它的工作方式有着奇怪的期望是的,我在前端使用angular。显示的json响应为错误!!!:响应状态为:400对URL:localhost:5000/api/Account/Login“…没有ErrorMessage对象的错误请求。
return BadRequest(new { ErrorMessage = "Account is locked." });