一、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方法。
歡迎大家掃描下方二維碼,和我一起學習更多的知識😊