ASP.NET核心服务器端验证失败导致Microsoft.AspNetCore.Mvc.SerializableError

Mak*_*hyn 9 .net c# asp.net asp.net-mvc .net-core

我使用[EmailAddress]属性来验证服务器端的电子邮件.但是,当我发送无效的电子邮件地址时,我会收到400状态代码响应而没有消息,而不是进入我的操作方法并看到ModelState错误.

调试输出只是说抛出了Microsoft.AspNetCore.Mvc.SerializableError.

请问有人解释一下吗?

模型:

public class LoginVm
{
    [Required(ErrorMessage = "Email cannot be empty.")]
    [EmailAddress(ErrorMessage = "Email has an incorrect format.")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Password cannot be empty.")]
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

行动:

[AllowAnonymous]
    [HttpPost]
    public IActionResult Authenticate([FromBody]LoginVm loginVm)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (loginVm.Email != "maksym@no.no" || loginVm.Password != "password")
        {
            return NotFound("There is no such user.");
        }

        return Ok();
    }
Run Code Online (Sandbox Code Playgroud)

调试输出:

  • Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP/1.1 POST http:// localhost:44381/api/accounts application/json 43 Microsoft.AspNetCore.Cors.Infrastructure.CorsService:信息:策略执行成功.
  • Microsoft.AspNetCore.Server.Kestrel:信息:连接ID"0HLF8QUE7VV6T",请求ID"0HLF8QUE7VV6T:00000004":应用程序已完成,但未读取整个请求正文.
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:路由与{action ="Authenticate",controller ="Account",page =""}匹配.执行操作WebApp.Controllers.AccountController.Authenticate(WebApp)
  • 'dotnet.exe'(CoreCLR:clrhost):已加载'C:\ Program Files\dotnet\shared\Microsoft.NETCore.App\_ 2.1.1\System.Runtime.Serialization.Primitives.dll'.跳过加载符号.模块已经过优化,调试器选项"Just My Code"已启用.
  • 'dotnet.exe'(CoreCLR:clrhost):加载'C:\ Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.1\System.Data.Common.dll'.跳过加载符号.模块已经过优化,调试器选项"Just My Code"已启用.
  • Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor:信息:执行ObjectResult,写入类型为"Microsoft.AspNetCore.Mvc.SerializableError"的值.
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:78.8614ms中执行的操作WebApp.Controllers.AccountController.Authenticate(WebApp)
  • Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在96.9303ms 400 application/json中完成; 字符集= utf-8的

请求:

POST http://localhost:58072/api/accounts HTTP/1.1
Host: localhost:58072
Connection: keep-alive
Content-Length: 47
Accept: application/json, text/plain, */*
Origin: https://localhost:44381
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Content-Type: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

{"email":"wrongemail","password":"wrongpassword"}
Run Code Online (Sandbox Code Playgroud)

spo*_*ahn 20

[ApiController]属性提供自动HTTP 400响应.

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

验证错误会自动触发HTTP 400响应.您的操作中不再需要以下代码:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}
Run Code Online (Sandbox Code Playgroud)

如何关闭此功能

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });

    ...
}
Run Code Online (Sandbox Code Playgroud)