Asp.Netcore使用Filter來實現介面的全域性異常攔截,以及前置攔截和後置攔截
全域性異常攔截器:
解決寫每個介面都需要去做容錯而新增try{}catch{},有了該異常攔截器後,所有介面都不需要去新增異常處理。
實現方式:
第一步:新建一個類繼承 IExceptionFilter,新增 using Microsoft.AspNetCore.Mvc.Filters;該類的名稱命名要求是:字尾必須ExceptionFilter,例如:GlobalExceptionFilter。該類必須實現OnException 這個方法。這個方法是當異常發生時會進入。 例如下面的例子:
public class ExceptionFilter : IExceptionFilter
{
/// <summary>
/// 發生異常時進入
/// </summary>
/// <param name="context"></param>
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled == false)
{
context.Result = new ContentResult
{
Content = context.Exception.Message,//這裡是把異常丟擲。也可以不丟擲。
StatusCode = StatusCodes.Status200OK,
ContentType = "text/html;charset=utf-8"
};
}
context.ExceptionHandled = true;
}
/// <summary>
/// 非同步發生異常時進入
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public Task OnExceptionAsync(ExceptionContext context)
{
OnException(context);
return Task.CompletedTask;
}
}
第二步:修改Stup.cs檔案如下即完成。
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) 把這段程式碼修改為:
.AddMvc(options =>
{
options.Filters.Add<GlobalExceptionFilter>();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
前置和後置攔截器:
解決介面入引數的合法性驗證問題,以及對引數等前期的資訊處理等。例如:訪問的合法性等。
實現方式:
第一步:異常攔截器很相似,新建一個類繼承 IActionFilter,新增 using Microsoft.AspNetCore.Mvc.Filters;該類的名稱命名要求是:字尾必須ActionFilter,例如:GlobalActionFilter。該類必須實現OnActionExecuted和OnActionExecuting這兩個方法。這個方法是當異常發生時會進入。 例如下面的例子:
public class GlobalActionFilter : IActionFilter
{
/// <summary>
/// Action 執行後攔截
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
}
/// <summary>
/// Action 執行前攔截[模型驗證應該在此處先處理]
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
context.HttpContext.Response.Headers["Access-Control-Allow-Origin"] = "*";//解決攔截器新增後跨域不生效的問題
if (!context.ModelState.IsValid)//驗證引數的合法性問題。返回錯誤資訊
{
///模型有效性驗證失敗處理邏輯...比如將提示資訊返回
StringBuilder stringBuilder = new StringBuilder();
///模型有效性驗證失敗處理邏輯.....
///如返回錯誤資訊,這裡可自動包裝
foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
stringBuilder.Append($"{ error.ErrorMessage}|");
}
}
context.Result = new ContentResult
{
Content = stringBuilder.ToString(),
StatusCode = StatusCodes.Status200OK,
ContentType = "text/html;charset=utf-8"
};
}
}
}
第二步:修改Stup.cs檔案如下即完成。
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) 把這段程式碼修改為:
.AddMvc(options =>
{
options.Filters.Add<GlobalActionFilter>();
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
模型和引數驗證的使用方式[配合前置攔截器,開發人員可以不用操心驗證和返回錯誤資訊]:
在引數前面新增特性,常用的三個特性如下
接收Query的寫法
[HttpGet("test")]
public object test([FromQuery] [Required(ErrorMessage = "名稱不能為空")][MaxLength(5,ErrorMessage = "名稱長度不能大於5")][MinLength(3,ErrorMessage = "名稱最小長度為3")] string name)
{
}
一個引數可以同時寫多個特性進行驗證。
接收Body的寫法
該特性驗證要在實體類上寫,接參時用實體類去接,這樣驗證通用起到效果。
例如:
[HttpPost("test")]
public object test([FromBody] Users user)
{
}
public class Users
{
[Required(ErrorMessage = "名稱不能為空")]
public string Name{get;set;};
public int Age{get;set;};
}
相關文章
- Spring-全域性異常攔截Spring
- springboot 全域性異常攔截器,友好異常提示Spring Boot
- spring mvc攔截器,spring攔截器以及AOP切面的區別和原始碼SpringMVC原始碼
- dubbo~全域性異常攔截器的使用與設計缺陷
- gRPC伺服器中新增全域性異常攔截器RPC伺服器
- 前端架構之vue+axios 前端實現登入攔截(路由攔截、http攔截)前端架構VueiOS路由HTTP
- dubbo~全域性異常攔截器的使用與設計缺陷~續
- Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高階配置”SpringMVC
- Proxy 攔截
- SpringMVC攔截器,設定不攔截的URLSpringMVC
- 攔截線上 sql 異常報錯SQL
- axios的全域性攔截之axios.interceptorsiOS
- Java實現的攔截器Java
- SpringMVC攔截器SpringMVC
- axios 攔截器iOS
- spring攔截器Spring
- axios攔截器iOS
- sql攔截器SQL
- 導彈攔截
- Mybatis 攔截器MyBatis
- MyBatis攔截器MyBatis
- 攔截器(Interceptor)與過濾器(Filter)過濾器Filter
- Flume內建攔截器與自定義攔截器(程式碼實戰)
- win10 microsoft edge網址被攔截如何取消攔截Win10ROS
- Xposed攔截抽象方法抽象
- Mybatis Interceptor 攔截器MyBatis
- WKCrashSDK - crash攔截工具
- spring boot 攔截器Spring Boot
- SpringMVC-攔截器SpringMVC
- gRPC(3):攔截器RPC
- 【SpringMVC】 4.3 攔截器SpringMVC
- SpringBoot攔截器中獲取註解、攔截器中注入ServiceSpring Boot
- spring mvc 攔截器的使用SpringMVC
- 攔截器的使用問題
- 在springboot中使用攔截器Spring Boot
- IIS 攔截主頁和SwaggerSwagger
- SpringMVC中的攔截器Interceptor實現SpringMVC
- Mybatis 分頁:Pagehelper + 攔截器實現MyBatis