asp.net core 系列 14 錯誤處理
一.概述
本文介紹處理 ASP.NET Core 應用中常見錯誤的一些方法。主要是關於: 開發環境異常頁;非開發環境 配置自定義異常處理頁;配置 狀態內碼表( 沒有正文響應,http狀態 400~ 599的)。
1.1 開發環境異常頁
要將應用配置為顯示有關異常的詳細資訊的頁面,請使用開發環境異常頁。要環境設定為 Development,具體檢視:asp.net core系列9環境。下面向 Startup.Configure 方法新增程式碼行:
if (env.IsDevelopment()) { //注意: 呼叫該方法,要放在對其捕獲異常的任何中介軟體前面,中介軟體格式Use{ xxx }(),如UseMvc(); app.UseDeveloperExceptionPage(); }
1.2 配置自定義異常處理頁
配置自定義異常處理頁,用於非 Development
環境下,下面是razor專案中的異常處理頁程式碼(Pages下Error.cshtml頁面)。
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/error"); }
在 MVC 應用中,不要使用 HTTP 方法特性(如 HttpGet
)修飾錯誤處理程式操作方法。 顯式謂詞可阻止某些請求訪問方法。 允許匿名訪問方法,以便未經身份驗證的使用者能夠接收錯誤檢視。
//mvc中,HomeController中的Error, 新增[AllowAnonymous] [AllowAnonymous] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); }
1.3配置狀態內碼表
預設情況下,應用不會為 HTTP 狀態程式碼提供豐富狀態內碼表,例如 404 未找到。下面我們訪問一個不存在的頁面,預設頁面顯示如下:
下面提供狀態內碼表,使用狀態內碼表中介軟體,向 Startup.Configure
方法中新增。注意: 管道中請求處理中介軟體之前呼叫 UseStatusCodePages。
//請求處理中介軟體之前呼叫 app.UseStatusCodePages(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc();
預設情況下,狀態內碼表中介軟體為常見狀態程式碼(如 404)新增純文字處理程式, 如下所示:
該中介軟體支援多種擴充套件方法。 一種方法採用 Lambda 表示式:
//自定義頁面的輸出型別和文字資訊及狀態碼,用於處理程式,檢查狀態程式碼在400~599之間且沒有正文的響應 app.UseStatusCodePages(async context => { context.HttpContext.Response.ContentType = "text/plain"; await context.HttpContext.Response.WriteAsync( "Status code page, status code: " + context.HttpContext.Response.StatusCode); });
UseStatusCodePages
過載需要使用內容型別和格式字串:
app.UseStatusCodePages("text/plain", "Status code page, status code: {0}");
1.4 UseStatusCodePagesWithRedirects重定向
該中介軟體作用是: (1) 向客戶端傳送“302 和狀態碼。(2)將客戶端重定向到 URL 模板中的位置。
//當沒有正文的響應時,重定向到指定頁面,{0}點位符表示請求出錯的http的狀態碼 app.UseStatusCodePagesWithRedirects("/error/{0}"); //請求處理中介軟體之前呼叫 // app.UseStatusCodePages();
下面是在razor專案中,當訪問一個不存在的頁面時http://localhost:60397/page/missingpage,地址重定向到error頁並顯示出錯的狀態碼,必要時還可以在error頁的OnGet()方法中進行業務處理。
參考文獻
官方資料: asp.net core 錯誤處理