參考:
- https://code-maze.com/action-filters-aspnetcore/
- https://github.com/aspnet/AspNetCore.Docs/issues/12157
- https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.0#automatic-http-400-responses
- 關閉默認模型驗證過濾器
[ApiController] 默認自帶有400模型驗證,且優先級比較高,如果需要自定義模型驗證,則需要先關閉默認的模型驗證
在StartUp.cs 中的MVC服務配置修改#region MVC services.AddMvc(o => { }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2) .ConfigureApiBehaviorOptions(o => { o.SuppressModelStateInvalidFilter = true; }); #endregion
- 首先定義統一輸出的格式為
{ code: errors:[ filed: message: ] }
- 添加自定義模型驗證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());
})
-
結果測試
-
擴展
- 利用攔截器來測試action 的運行時間,記錄日志,並設置時間限制,超過某個時間段自動發送郵件通知維護人員