[英]Overriding BadRequest response in ASP.NET Core ResourceFilter
I am implementing a resource filter to store invalid requests in database and override returned BadRequest response. 我正在实现资源过滤器,以将无效请求存储在数据库中并覆盖返回的BadRequest响应。
I stored invalid requests successfully but I am struggling with overriding response, I tried the following: 我成功存储了无效的请求,但在响应响应方面很挣扎,我尝试了以下操作:
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; }
}
But the returned response is not being overridden. 但是返回的响应不会被覆盖。 Is there a way to override the response inside Resource filters?
有没有办法覆盖资源过滤器中的响应?
PS: I am using [ApiController] attribute. PS:我正在使用[ApiController]属性。
As we all kown , the IResourceFilter
runs immediately after the authorization filter and is suitable for short-circular . 我们都知道,
IResourceFilter
在授权过滤器之后立即运行,并且适合于短圆形。
However , you will make no influence on the result by setting Result=new BadRequestObjectResult()
when the result execution has finished . 但是,在结果执行完成时,通过设置
Result=new BadRequestObjectResult()
不会对结果产生任何影响。
See the workflow as below : 请参见以下工作流程:
According to the workflow above , we should run the MyFilter
after the stage of model binding and before the stage of result filter . 根据上面的工作流程,我们应该在模型绑定阶段之后和结果过滤器阶段之前运行
MyFilter
。 In other words , we should put the logic into a action filter . 换句话说,我们应该将逻辑放入动作过滤器中。 Since there's already a
ActionFilterAttribute
out of box , just create a MyFilterAttribute
which inherits from the ActionFilterAttribute
: 既然已经有一个
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" });
}
}
}
Here's a screenshot the filter works : 这是过滤器工作的屏幕截图:
[Edit]: [编辑]:
The code of controller decorated with [ApiController]
: 用
[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.