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方法。