DOTNET CORE WEB API 統一模型驗證攔截器


參考:

  1. 關閉默認模型驗證過濾器
    [ApiController] 默認自帶有400模型驗證,且優先級比較高,如果需要自定義模型驗證,則需要先關閉默認的模型驗證
    在StartUp.cs 中的MVC服務配置修改
    #region MVC
    services.AddMvc(o =>
    {
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(o =>
    {
        o.SuppressModelStateInvalidFilter = true;
    });
     #endregion
    
  2. 首先定義統一輸出的格式為
    {
        code:
        errors:[
            filed:
            message:
        ]
    }
    
  3. 添加自定義模型驗證DTO
     public class ErrorResultDTO
        {
            /// <summary>
            /// 參數領域
            /// </summary>
            public string Field { get; set; }
    
            /// <summary>
            /// 錯誤信息
            /// </summary>
            public string Message { get; set; }   
        }
    
4.  添加過濾器
    過濾器繼承自:ActionFilterAttribute, IActionFilter
    ``` c#
    public class ModelActionFiter :ActionFilterAttribute, IActionFilter
        {
            public ModelActionFiter()
            {
            }
            public override void OnActionExecuted(ActionExecutedContext context)
            {
                
            }

           public override void OnActionExecuting(ActionExecutingContext context)
            {
                if (!context.ModelState.IsValid)
                {     
                    List<ErrorResultDTO> errorResults = new List<ErrorResultDTO>();
                    foreach (var item in context.ModelState)
                    {
                        var result = new ErrorResultDTO
                        {
                            Field = item.Key,
                            Msg = "",
                        };
                        foreach (var error in item.Value.Errors)
                        {
                            if (!string.IsNullOrEmpty(result.Msg))
                            {
                                result.Msg += '|';
                            }
                            result.Msg += error.ErrorMessage;
                        }
                        errorResults.Add(result);
                    }
                    context.Result = new BadRequestObjectResult(new
                    {
                        Code = StatusCodes.Status400BadRequest,
                       Errors = errorResults
                    });  
                }
            }
        }
    ```
5. 將寫的過濾器注冊到全局

    ``` c#  
      services.AddMvc(o =>
            {
                o.Filters.Add(new ModelActionFiter());
       })
  1. 結果測試

  2. 擴展

    • 利用攔截器來測試action 的運行時間,記錄日志,並設置時間限制,超過某個時間段自動發送郵件通知維護人員


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM