gpt4 book ai didi

c# - 在 ASP.NET Core 中到达 Controller 之前拦截不良请求

转载 作者:行者123 更新时间:2023-12-02 03:44:43 25 4
gpt4 key购买 nike

我有一个逻辑可以应用,以防收到的请求是 BadRequest,为此我创建了一个过滤器:

public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
// Apply logic
}
}
}

启动时:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => { options.Filters.Add<ValidateModelAttribute>(); });
}

Controller :

[Route("api/[controller]")]
[ApiController]
public class VerifyController : ControllerBase
{
[Route("test")]
[HttpPost]
[ValidateModel]
public ActionResult<Guid> validationTest(PersonalInfo personalInfo)
{
return null;
}
}

型号:

public class PersonalInfo
{
public string FirstName { get; set; }
[RegularExpression("\\d{4}-?\\d{2}-?\\d{2}", ErrorMessage = "Date must be properly formatted according to ISO 8601")]
public string BirthDate { get; set; }
}

问题是当我在线上放置一个断点时:

if (!context.ModelState.IsValid)

仅当我发送的请求有效时,执行才会到达此行。如果我发送错误的请求,为什么它没有通过过滤器?

最佳答案

[ApiController]您应用于 Controller 的属性添加 Automatic HTTP 400 Responses到 MVC 管道,这意味着如果 ModelState 无效,则不会执行您的自定义过滤器和操作。

我看到了一些影响其工作方式的选项:

  1. 删除[ApiController]属性

    虽然您可以删除 [ApiController] 属性,但这也会导致它提供的一些其他功能丢失,例如 Binding source parameter inference .

  2. 仅禁用自动 HTTP 400 响应

    这是来自 docs 的示例显示了如何禁用此功能:

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

    此代码位于 StartupConfigureServices 方法内部。

  3. 自定义生成的自动响应

    如果您只想向调用者提供自定义响应,则可以自定义返回的内容。我已经在另一个答案中描述了它是如何工作的,here .

关于c# - 在 ASP.NET Core 中到达 Controller 之前拦截不良请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51870603/

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