【问题标题】:ASP.NET Core server side validation failure causes Microsoft.AspNetCore.Mvc.SerializableErrorASP.NET Core 服务器端验证失败导致 Microsoft.AspNetCore.Mvc.SerializableError
【发布时间】:2018-12-22 01:31:07
【问题描述】:

我使用 [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; }
}

行动:

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

调试输出:

  • Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: 请求开始 HTTP/1.1 POST http://localhost:44381/api/accounts application/json 43 Microsoft.AspNetCore.Cors.Infrastructure.CorsService:信息:策略执行成功。
  • Microsoft.AspNetCore.Server.Kestrel:Information: Connection id "0HLF8QUE7VV6T", Request 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”。跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。
  • “dotnet.exe”(CoreCLR:clrhost):已加载“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.1\System.Data.Common.dll”。跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。
  • Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor:信息:正在执行 ObjectResult,写入类型为“Microsoft.AspNetCore.Mvc.SerializableError”的值。
  • Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:在 78.8614 毫秒内执行操作 WebApp.Controllers.AccountController.Authenticate (WebApp)
  • Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在 96.9303 毫秒 400 应用程序/json 中完成; charset=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"}

【问题讨论】:

  • 您发送的请求是什么?
  • @Steve,http 方法,url,标头和正文,基本上所有描述我的请求的东西
  • 您正在发布到 api/accounts。那是控制器还是有默认方法路由?
  • 内容长度看起来不对。你自己计算的吗?它可以解释无需阅读整个请求正文即可完成的应用程序
  • @Steve,是的,这是控制器的操作

标签: c# asp.net .net asp.net-mvc .net-core


【解决方案1】:

[ApiController] 属性提供Automatic HTTP 400 responses

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase

验证错误会自动触发 HTTP 400 响应。这 以下代码在您的操作中变得不必要:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}

如何关闭此功能

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多