繁体   English   中英

覆盖ASP.NET Core ResourceFilter中的BadRequest响应

[英]Overriding BadRequest response in ASP.NET Core ResourceFilter

我正在实现资源过滤器,以将无效请求存储在数据库中并覆盖返回的BadRequest响应。

我成功存储了无效的请求,但在响应响应方面很挣扎,我尝试了以下操作:

public class MyFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        ;
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        if (!context.ModelState.IsValid)
        {
            //store request in data base
            context.Result= new BadRequestObjectResult(new MyErrorModel(){ID = "1",FriendlyMessage = "Your request was invalid"});
        }
    }
}

public class MyErrorModel
{
    public string FriendlyMessage { get; set; }
    public string ID { get; set; }
}

但是返回的响应不会被覆盖。 有没有办法覆盖资源过滤器中的响应?

PS:我正在使用[ApiController]属性。

我们都知道, IResourceFilter在授权过滤器之后立即运行,并且适合于短圆形。

但是,在结果执行完成时,通过设置Result=new BadRequestObjectResult()不会对结果产生任何影响。

请参见以下工作流程:

在此处输入图片说明

根据上面的工作流程,我们应该在模型绑定阶段之后和结果过滤器阶段之前运行MyFilter 换句话说,我们应该将逻辑放入动作过滤器中。 既然已经有一个ActionFilterAttribute在箱子外面,只需创建一个MyFilterAttribute从继承ActionFilterAttribute

public class MyFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            //store request in data base
            context.Result = new BadRequestObjectResult(new MyErrorModel() { ID = "1", FriendlyMessage = "Your request was invalid" });
        }
    }
}

这是过滤器工作的屏幕截图:

在此处输入图片说明

[编辑]:

[ApiController]装饰的控制器代码:

namespace App.Controllers
{
    [ApiController]
    [Route("Hello")]
    public class HelloController : Controller
    {
        [MyFilter]
        [HttpGet("index")]
        public IActionResult Index(int x)
        {
            var y =ModelState.IsValid;
            return View();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM