簡體   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