一.概述 本文介紹處理 ASP.NET Core 應用中常見錯誤的一些方法。主要是關於:開發環境異常頁;非開發環境配置自定義異常處理頁;配置狀態代碼頁(沒有正文響應,http狀態400~599的)。 1.1 開發環境異常頁 要將應用配置為顯示有關異常的詳細信息的頁面,請使用開發環境異常頁。要環境設置 ...
一.概述
本文介紹處理 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 錯誤處理