【问题标题】:Using [FromBody] and able to handle an invalid input使用 [FromBody] 并能够处理无效输入
【发布时间】:2018-09-15 09:10:05
【问题描述】:

在 ASP.NET Core(本例中为 2.1)的控制器中使用 [FromBody] 时,它会处理对指定模型的所有转换并确保模型有效。这意味着如果提供的输入格式错误,甚至不会调用控制器方法。

  1. 如何实现即使输入无效也会调用我的控制器方法,以便我自己处理错误情况?
  2. 有没有一种方法可以编写我自己的中间件,以便按照我的系统需要的方式记录无效输入,或者是否有我可以使用的默认输入?

【问题讨论】:

  • 是的,它有。我使用由 dotnet cores mvc 模板生成的默认控制器模板。
  • 有多个独立的 dotnet 核心应用程序正在运行。他们都相互影响。由于我们严重依赖数据但质量不足,我希望能够处理我自己的无效请求,方法是在将它们变成有效的 ModelState 之前尝试修复它们,或者吐出有意义的日志消息,工程师可以查看这些消息以稍后修复它。因为所有的服务都会做同样的日志报告,我想到了一个中间件,它负责为每个人进行自定义验证,这样并不是每个控制器功能都需要手动检查。
  • 因为第一个是最重要的。如果有办法自动处理所有这些,我仍然会感兴趣。

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


【解决方案1】:

在 asp.net core 2.1 中,ApiController 属性已被 introduced 作为选择加入特定于 Web API 的约定和行为的方式。在启动时使用CompatibilityVersion.Version_2_1 标志设置compatibility 的级别。

新行为是验证错误将automatically trigger an HTTP 400 response。如文档中所述,抑制这种行为很容易:

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

在这种情况下,您可以照常验证模型:

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

至于你的第二个问题,这个问题太笼统了:

...以我的系统需要的方式记录无效输入...

您可以使用filters(如ExceptionFilterAttribute)。也许这就是你要找的东西?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多