首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET核心:防止针对单个操作的自动HTTP400响应

ASP.NET核心:防止针对单个操作的自动HTTP400响应
EN

Stack Overflow用户
提问于 2018-10-09 11:06:19
回答 5查看 2.9K关注 0票数 7

我喜欢自动HTTP 400响应在ASP.NET Core2.1中的新功能,它在大多数情况下效果都很好。

但是,在一个操作中,我需要在验证有效负载之前做一些预处理。我有一个自定义验证器,它需要模型中的两个值来执行验证。其中一个值在路径中,所以我想从路径中在模型上设置这个值,然后进行验证。

我不想关闭所有操作的功能:

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });
}

有什么办法我可以关掉它只是为了一个单独的行动吗?

编辑:

我试图修改InvalidModelStateResponseFactory,但是它没有解决我的问题,因为我仍然需要进入控制器操作:

代码语言:javascript
运行
复制
services.Configure<ApiBehaviorOptions>(options =>
{
    options.InvalidModelStateResponseFactory = actionContext =>
    {
        var ignore = actionContext.ActionDescriptor.FilterDescriptors.Any(fd => fd.Filter is SuppressModelStateInvalidFilterAttribute);
        if (ignore)
        {
            // Can only return IActionResult so doesn't enter the controller action.
        }

        return new BadRequestObjectResult(actionContext.ModelState);
    };
});

[AttributeUsage(AttributeTargets.Method)]
public class SuppressModelStateInvalidFilterAttribute : FormatFilterAttribute
{
}

编辑:

以下是我在asp.net核心回购中提出的一个问题的链接,以防我在这方面有所进展-- https://github.com/aspnet/Mvc/issues/8575

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-10-09 11:14:33

这可能通过为您的具体情况实现自己的验证器来解决。文档中很好地涵盖了这一问题。

https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-2.1#custom-validation

这或者可能是一个定制的模型绑定器,用于在验证之前使用所有预处理来创建模型。

票数 1
EN

Stack Overflow用户

发布于 2019-05-28 22:27:51

更新:您只需在Startup.cs中的ConfigureServices中使用以下代码:

代码语言:javascript
运行
复制
services.Configure<ApiBehaviorOptions>(apiBehaviorOptions => {
    apiBehaviorOptions.SuppressModelStateInvalidFilter = true;
});

根据Simon的回答,我不得不修改ASP.Net Core2.2的属性如下:

代码语言:javascript
运行
复制
/// <summary>
/// Suppresses the default ApiController behaviour of automatically creating error 400 responses
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class SuppressModelStateInvalidFilterAttribute : Attribute, IActionModelConvention {
    private static readonly Type ModelStateInvalidFilterFactory = typeof(ModelStateInvalidFilter).Assembly.GetType("Microsoft.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilterFactory");

    public void Apply(ActionModel action) {
        for (var i = 0; i < action.Filters.Count; i++) {
            if (action.Filters[i] is ModelStateInvalidFilter || action.Filters[i].GetType() == ModelStateInvalidFilterFactory) {
                action.Filters.RemoveAt(i);
                break;
            }
        }
    }
}
票数 12
EN

Stack Overflow用户

发布于 2018-10-10 14:28:40

我收到了Microsoft - https://github.com/aspnet/Mvc/issues/8575的回复。

下面这句话很有魅力。

代码语言:javascript
运行
复制
[AttributeUsage(AttributeTargets.Method)]
public class SuppressModelStateInvalidFilterAttribute : Attribute, IActionModelConvention
{
    public void Apply(ActionModel action)
    {
        for (var i = 0; i < action.Filters.Count; i++)
        {
            if (action.Filters[i] is ModelStateInvalidFilter)
            {
                action.Filters.RemoveAt(i);
                break;
            }
        }
    }
}

在我的控制器中,在重新验证模型之前,我可以对模型进行更改(注意ModelState.Clear(),TryValidateModel添加到现有的模型状态):

代码语言:javascript
运行
复制
if (model == null)
{
    return BadRequest(ModelState);
}

model.Property = valueFromPath;

ModelState.Clear();
if (TryValidateModel(model) == false)
{
    return BadRequest(ModelState);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52719558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档