代码之家  ›  专栏  ›  技术社区  ›  Yahya Hussein

重写中的请求响应ASP.NET核心资源过滤器

  •  0
  • Yahya Hussein  · 技术社区  · 7 年前

    我正在实现一个资源过滤器来存储数据库中的无效请求,并覆盖返回的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; }
    }
    

    但是返回的响应没有被重写。 有没有办法覆盖资源过滤器内的响应?

    1 回复  |  直到 7 年前
        1
  •  2
  •   itminus    7 年前

    IResourceFilter 在授权过滤器之后立即运行,适用于短循环。

    Result=new BadRequestObjectResult() 当结果执行完成时。

    工作流程如下:

    enter image description here

    根据上面的工作流程,我们应该运行 MyFilter 在模型绑定阶段之后和结果过滤阶段之前。换句话说,我们应该把逻辑放到动作过滤器中。因为已经有 ActionFilterAttribute 开箱即用,只需创建一个 MyFilterAttribute 操作筛选器属性 :

    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" });
            }
        }
    }
    

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

    enter image description here

    控制器代码 [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();
            }
        }
    }