在新建一個ASP.NET Core項目后,在項目Startup類的Configure方法中默認會添加兩個方法的調用,app.UseDeveloperExceptionPage和app.UseExceptionHandler,如下所示:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
其實app.UseDeveloperExceptionPage方法就是在告訴ASP.NET Core,當代碼發生異常錯誤后,在瀏覽器上顯示異常錯誤信息頁,也就是我們在開發代碼時,經常看到的異常錯誤信息頁:
該異常錯誤信息頁返回的HTTP狀態碼為500
但是我們可以看到app.UseDeveloperExceptionPage方法,是寫在if (env.IsDevelopment())這個條件里面的,所以當只有在開發環境下,ASP.NET Core才會顯示上面的異常錯誤信息頁,而在其它環境下(例如ASP.NET Core項目發布后所處的生產環境),會執行app.UseExceptionHandler方法,該方法會傳遞一個URL地址,本例中我們傳遞的就是"/Home/Error":
app.UseExceptionHandler("/Home/Error");
也就是說在非開發環境下,ASP.NET Core項目中有代碼發生異常后,ASP.NET Core會將"/Home/Error"這個URL地址的頁面內容呈現到客戶端瀏覽器上,而"/Home/Error"是一個自定義的MVC視圖頁面,你可以定義任何想顯示的內容,在這里我們只顯示一個錯誤提示"后台代碼發生錯誤!",以下是視圖文件"Error.cshtml"的內容:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Error</title> </head> <body> <h1>后台代碼發生錯誤!</h1> </body> </html>
注意當使用app.UseExceptionHandler方法,將用戶HTTP請求轉向"/Home/Error"這個URL地址后,在HomeController的Error方法中,HTTP請求的默認狀態就已經變為500了:
當然這里,我們也可以在HomeController的Error方法中,通過Response.StatusCode屬性將其改為其它狀態碼。
最終呈現在客戶端瀏覽器上的頁面,就是我們在前面定義的視圖文件"Error.cshtml":
所以app.UseDeveloperExceptionPage和app.UseExceptionHandler兩個方法,都是用來定義ASP.NET Core項目有代碼發生異常后,給客戶端瀏覽器顯示什么頁面的,只不過app.UseDeveloperExceptionPage方法用於開發環境,ASP.NET Core會自動生成一個異常顯示頁面,而app.UseExceptionHandler方法用於非開發環境,並且需要我們自己定義異常顯示頁面。