加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在到达ASP.NET Core中的控制器之前拦截错误请求

发布时间:2020-12-16 01:21:37 所属栏目:百科 来源:网络整理
导读:如果收到的请求是BadRequest,我有一个逻辑申请,为此我创建了一个过滤器: public class ValidateModelAttribute : ActionFilterAttribute{ public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { /
如果收到的请求是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>(); });
}

控制器:

[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]属性会向MVC管道添加“自动HTTP 400响应”,这意味着如果ModelState无效,则不会执行自定义过滤器和操作.您有几个选项可以影响其工作原理:

1.删??除[ApiController]属性

虽然您可以删除[ApiController]属性,但这也会导致丢失其提供的某些其他功能,例如“绑定源参数推断”.

2.仅禁用自动HTTP 400响应

以下是docs中的示例,其中显示了如何禁用此功能:

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

此代码在Startup的ConfigureServices方法中.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读