Asp.Netcore使用Filter來實現介面的全域性異常攔截,以及前置攔截和後置攔截

dotnet_Monkey發表於2018-12-24

全域性異常攔截器:

       解決寫每個介面都需要去做容錯而新增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;};
}

 

相關文章