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
- dubbo~全域性異常攔截器的使用與設計缺陷
- js攔截全域性ajax請求JS
- 攔截器,攔截器棧總結
- 前端架構之vue+axios 前端實現登入攔截(路由攔截、http攔截)前端架構VueiOS路由HTTP
- dubbo~全域性異常攔截器的使用與設計缺陷~續
- spring mvc攔截器,spring攔截器以及AOP切面的區別和原始碼SpringMVC原始碼
- 攔截線上 sql 異常報錯SQL
- Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高階配置”SpringMVC
- gRPC伺服器中新增全域性異常攔截器RPC伺服器
- SpringMVC攔截器,設定不攔截的URLSpringMVC
- Java實現的攔截器Java
- Java Struts 實現攔截器Java
- MyBatis攔截器MyBatis
- Mybatis 攔截器MyBatis
- sql攔截器SQL
- 導彈攔截
- vue中用axios攔截器攔截請求和響應VueiOS
- 怎樣攔截classloader實現類方法截獲
- Flume內建攔截器與自定義攔截器(程式碼實戰)
- 攔截器(Interceptor)與過濾器(Filter)過濾器Filter
- iOS 簡訊攔截 Message Filter ExtensioniOSFilter
- win10 microsoft edge網址被攔截如何取消攔截Win10ROS
- axios攔截器iOS
- Mybatis Interceptor 攔截器MyBatis
- Xposed攔截抽象方法抽象
- WKCrashSDK - crash攔截工具
- axios 攔截器iOS
- spring攔截器Spring
- Java interceptor 攔截器Java
- IOS 手勢攔截iOS
- SpringMVC攔截器SpringMVC
- axios的全域性攔截之axios.interceptorsiOS
- Mybatis 分頁:Pagehelper + 攔截器實現MyBatis
- 小程式手動實現路由攔截路由
- Struts2攔截器實現原理
- Autofac實現攔截器和切面程式設計程式設計