gpt4 book ai didi

ASP.NET 核心 : Prevent Automatic HTTP 400 responses for individual action

转载 作者:行者123 更新时间:2023-12-01 10:20:59 29 4
gpt4 key购买 nike

我喜欢 Automatic HTTP 400 responses ASP.NET Core 2.1 的新功能,它在大多数情况下运行良好。

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

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

public void ConfigureServices(IServiceCollection services)
{
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
}

有什么办法可以仅针对个人操作将其关闭?

编辑:

我尝试修改 InvalidModelStateResponseFactory 但它没有解决我的问题,因为我仍然需要进入 Controller 操作:
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

最佳答案

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

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

根据 Simon Vane 的回答,我不得不修改 ASP.Net Core 2.2 的属性,如下所示:
/// <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;
}
}
}
}

关于ASP.NET 核心 : Prevent Automatic HTTP 400 responses for individual action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52719558/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com