C# 编辑坏请求
我有一个响应对象,如果控制器中存在异常,我希望将其返回给用户。然而,当我试图发回错误请求时,我似乎无法发回我的响应对象。因此,我的问题是如何编辑BadRequst以包含我的响应对象和/或如何发回带有错误状态代码的响应对象 控制器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 {
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." });