ASP.NET核心操作筛选器未调用

时间:2019-03-07 18:40:57

标签: c# .net asp.net-core actionfilterattribute custom-action-filter

我有一个ASP.NET Core API(.Net Core 2.1),并且使用本文实现了一个操作筛选器

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.1#action-filters

在模型中,我使用数据注释来验证模型,并在Controller中为Action添加了ValidateModel属性。

    [HttpPost("CreateShipment")]
    [ValidateModel]
    public IActionResult CreateShipment([FromBody] CreateShipmentRequest request)
    {
         if (ModelState.IsValid)
         {
            //Do something
         }
         return Ok();
    }

我使用Postman对此进行了测试,并且只有在Model有效的情况下才会调用Action Filter。如果我的请求缺少必填字段或某个值超出范围,则不会调用Action Filter。相反,我在响应中收到一个400错误的请求,其中包含模型状态。

我实现了动作过滤器,因为我想自定义模型验证错误。我的理解是,在模型绑定时会调用动作过滤器。有人可以帮我弄清楚为什么会这样,以及如何使操作筛选器正常工作吗?

更新:发布问题2秒后我找到了解决方案,下面发布的链接@Silvermind也是很好的信息。

我在Startup.cs中添加了以下行

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

在Microsoft网站上有很好的记录。 https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#automatic-http-400-responses

2 个答案:

答案 0 :(得分:2)

在Startup.cs中添加以下行,ConfigureServices()方法解决了该问题。事实证明,.Net Core默认情况下启用了自动400个响应。如果要添加自定义操作过滤器,则需要在启动时设置这些选项。

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

在Microsoft网站上有很好的记录:

https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#automatic-http-400-responses

答案 1 :(得分:0)

[ApiController]属性自动执行模型验证并触发HTTP响应404,在.Net Core 3.0中,您可以链接到新的AddControllers()以取消此功能:

services.AddControllers()
                .ConfigureApiBehaviorOptions(options =>
                {
                    options.SuppressModelStateInvalidFilter = true;
                });