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


一、Configure

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

二、Middleware 

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

三、ErrorHandlingMiddleware

3.1、為什么使用ErrorHandlingMiddleware全局異常捕獲

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

3.2、構建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.3、注冊中間件使用

  在Startup.cs中的Configure方法中加上中間件的注冊。
 
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
 
  然后就可以嘗試下了,在Invoke方法打上斷點,然后運行項目,會發現,項目會先運行到Invoke方法。
 
 
 

  歡迎大家掃描下方二維碼,和我一起學習更多的知識😊

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM