Configure、中間件與ErrorHandlingMiddleware全局異常捕獲

1、Configure

  Startup.cs中的Configure方法主要是http處理管道配置、中間件和一些系統配置,其中
  IApplicationBuilder: 定義一個類,該類提供配置應用程序請求的機制管道。經過IApplicationBuilder下的run、use方法傳入管道處理方法。這是最經常使用方法,對於一個真實環境的應用基本上都須要好比權限驗證、跨域、異常處理等。
  IHostingEnvironment:提供有關正在運行的應用程序的web託管環境的信息
       簡單來講Configure方法就是來加載一些中間件以及處理一些管道配置和系統配置的,下面看下什麼是中間件。
 

2、Middleware 

       Middleware  中間件是一個處理http請求和響應的組件,多箇中間件構成了處理管道(Handler pipeline),每一箇中間件能夠決定是否傳遞至管道中的下一中間件。
       註冊--一旦註冊中間件後,每次請求和響應均會被調用。中間件的註冊在startup中的Configure方法完成,在configure方法中使用IApplicationBuilder對象的Run、Map、Use方法傳入匿名委託(delegate)。
       具體例子咱們一塊兒看下ErrorHandlingMiddleware,如何註冊中間件的以及使用的。

3、ErrorHandlingMiddleware

3.一、爲何使用ErrorHandlingMiddleware全局異常捕獲

              有些時候項目總會出現一些始料未及的錯誤,項目啓動瞬間崩塌。一臉懵,都不知道咋回事。剛啓動就完事兒了。還有的狀況測試接口的時候,打了斷點,而後運行項目。恰恰死活不進斷點。結果返回一個200ok,
  甚是惱火。這時候ErrorHandlingMiddleware就起做用了,無論應該運行如何,至少會進入ErrorHandlingMiddleware方法,一旦報錯也會出現錯誤信息,這樣咱們也就能好快的解決問題。並且ErrorHandlingMiddleware簡單,方便快捷。

3.二、構建ErrorHandlingMiddleware方法

                          
    
 public class ErrorHandlingMiddleware
    {
        private readonly RequestDelegate next;
        public ErrorHandlingMiddleware(RequestDelegate next)
        {
            this.next = next;
        }
        public async Task Invoke(HttpContext context /* other dependencies */)
        {
            try
            {
                await next(context);
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(context, ex);
            }
           
        }
        private static Task HandleExceptionAsync(HttpContext context, Exception ex)
        {
            var code = HttpStatusCode.InternalServerError; // 500 if unexpected
            var Info = "";
            switch (context.Response.StatusCode)
            {
                case 401:
                    Info = "沒有權限";
                    break;
                case 404:
                    Info = "未找到服務";
                    break;
                case 403:
                    Info = "服務器理解請求客戶端的請求,可是拒絕執行此請求";
                    break;
                case 500:
                    Info = "服務器內部錯誤,沒法完成請求";
                    break;
                case 502:
                    Info = "請求錯誤";
                    break;
                default:
                    Info = "內部錯誤";
                    break;
            }
            LogHelp.Error(ex);
            var result = JsonConvert.SerializeObject(new { error = ex.Message });
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = (int)code;
            return context.Response.WriteAsync(result);
        }
    }

 

 
              無論如何,項目運行了都會進入Invoke方法,一旦出現錯誤的話就會進入HandleExceptionAsync方法,記錄錯誤而後返回錯誤信息

3.三、註冊中間件使用

  在Startup.cs中的Configure方法中加上中間件的註冊。
 
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
 
  而後就能夠嘗試下了,在Invoke方法打上斷點,而後運行項目,會發現,項目會先運行到Invoke方法。
相關文章
相關標籤/搜索