Asp.Net Core-異常處理
Asp.Net Core-異常處理
在這一章,我們將討論異常和錯誤處理。當 ASP.NET Core應用程式中發生錯誤時,您可以以各種不同的方式來處理。讓我們來看看通過添加一個中介軟體來處理異常情況,這個中介軟體將協助我們處理錯誤。
要類比出錯,讓我們轉到應用程式,運行,如果我們只是拋出異常的話,看看程式是如何運轉轉的。
1 using Microsoft.AspNet.Builder; 2 using Microsoft.AspNet.Hosting; 3 using Microsoft.AspNet.Http; 4 using Microsoft.Extensions.DependencyInjection; 5 using Microsoft.Extensions.Configuration; 6 namespace FirstAppDemo { 7 public class Startup { 8 public Startup() { 9 var builder = new ConfigurationBuilder() 10 .AddJsonFile("AppSettings.json"); 11 Configuration = builder.Build(); 12 } 13 public IConfiguration Configuration { get; set; } 14 15 // This method gets called by the runtime. 16 // Use this method to add services to the container. 17 // For more information on how to configure your application, 18 // visit http://go.microsoft.com/fwlink/?LinkID=398940 19 public void ConfigureServices(IServiceCollection services) { 20 } 21 22 // This method gets called by the runtime. 23 // Use this method to configure the HTTP request pipeline.24 public void Configure(IApplicationBuilder app) { 25 app.UseIISPlatformHandler(); 26 app.UseRuntimeInfoPage(); 27 28 app.Run(async (context) => { 29 throw new System.Exception("Throw Exception"); 30 var msg = Configuration["message"]; 31 await context.Response.WriteAsync(msg); 32 }); 33 } 34 35 // Entry point for the application. 36 public static void Main(string[] args) => WebApplication.Run<Startup>(args); 37 } 38 }
它只會拋出一個非常通用的異常資訊。儲存Startup.cs頁面並運行您的應用程式。
您將看到我們未能載入此資源。出現了一個 HTTP 500 錯誤,內部伺服器錯誤,那個頁面不是很有協助。它可能很方便得到一些異常資訊。
讓我們添加另一個中介軟體 UseDeveloperExceptionPage。
1 // This method gets called by the runtime. 2 // Use this method to configure the HTTP request pipeline. 3 public void Configure(IApplicationBuilder app) { 4 app.UseIISPlatformHandler(); 5 app.UseDeveloperExceptionPage(); 6 app.UseRuntimeInfoPage(); 7 8 app.Run(async (context) => { 9 throw new System.Exception("Throw Exception"); 10 var msg = Configuration["message"]; 11 await context.Response.WriteAsync(msg); 12 }); 13 }14
這個中介軟體與其他的有點不同,其他中介軟體通常監聽傳入的請求並對請求做一些響應。
UseDeveloperExceptionPage不會如此在意傳入的請求在之後的管道會發生什麼。
它只是調用下一個中介軟體,然後再等待,看看管道中是否會出現異常,如果有異常,這塊中介軟體會給你一個關於該異常的錯誤頁面。
現在讓我們再次運行應用程式。將會產生一個如下面的螢幕所示的輸出。
現在如果程式中出現異常,您將在頁面中看到一些想要看到的異常資訊。你也會得到一個堆疊追蹤:這裡可以看到Startup.cs第37行有一個未處理的異常拋出。
所有這些異常資訊對開發人員將非常有用。事實上,我們可能只希望當開發人員運行應用程式時才顯示這些異常資訊。
Asp.Net Core 靜態檔案
Asp.Net Core 靜態檔案
案例
在這一章,我們將學習如何使用檔案。幾乎每個web應用程式都需要一個重要特性:能夠從檔案系統提供檔案(靜態檔案)。
靜態檔案像JavaScript檔案、圖片、CSS檔案等,我們Asp.Net Core應用程式可以直接提供給客戶。
靜態檔案通常位於web根(wwwroot)檔案夾。
預設情況下,這是我們可以直接從檔案系統提供檔案的唯一的地方。
案例
現在讓我們通過一個簡單的樣本來瞭解我們在我們的應用程式如何提供這些靜態檔案。
在這裡,我們想要向我們的 FirstAppDemo 應用程式添加一個簡單的 HTML 檔案,該 HTML 檔案放在web 根 (wwwroot) 檔案夾。在方案總管中按右鍵wwwroot檔案夾並選擇Add→新項。
在中間窗格中,選擇 HTML 頁面並稱之為 index.html,單擊添加按鈕。
你會看到一個簡單的index.html檔案。讓我們在其中添加一些簡單的文本和標題如下所示。
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" />
< title >Welcome to ASP.NET Core</ title >
</ head >
< body >
Hello, Wolrd! this message is from our first static HTML file.
</ body >
</ html >
|
當您運行應用程式並在瀏覽器中輸入index.html時,您將看到app.Run中介軟體將拋出一個異常,因為目前在我們的應用程式中什麼都沒有。
現在我們的項目中沒有中介軟體會去找檔案系統上的任何檔案。
為瞭解決這個問題,通過在方案總管中按右鍵您的項目並選擇管理NuGet包進入到NuGet包管理器。
搜尋 Microsoft.AspNet.StaticFiles,會找到靜態檔案中介軟體。讓我們安裝此 nuget 程式包,現在我們可以在Configure方法中註冊中介軟體。
讓我們在下面的程式中所示的Configure方法中添加 UseStaticFiles 中介軟體。
1 using Microsoft.AspNet.Builder; 2 using Microsoft.AspNet.Hosting; 3 using Microsoft.AspNet.Http; 4 using Microsoft.Extensions.DependencyInjection; 5 using Microsoft.Extensions.Configuration; 6 namespace FirstAppDemo { 7 public class Startup { 8 public Startup() { 9 var builder = new ConfigurationBuilder() 10 .AddJsonFile("AppSettings.json"); 11 Configuration = builder.Build(); 12 } 13 public IConfiguration Configuration { get; set; } 14 15 // This method gets called by the runtime. 16 // Use this method to add services to the container. 17 // For more information on how to configure your application, 18 // visit http://go.microsoft.com/fwlink/?LinkID=398940 19 public void ConfigureServices(IServiceCollection services) { 20 } 21 22 // This method gets called by the runtime. 23 // Use this method to configure the HTTP request pipeline. 24 public void Configure(IApplicationBuilder app) { 25 app.UseIISPlatformHandler(); 26 app.UseDeveloperExceptionPage(); app.UseRuntimeInfoPage(); 27 app.UseStaticFiles(); 28 29 app.Run(async (context) => { 30 throw new System.Exception("Throw Exception"); 31 var msg = Configuration["message"]; 32 await context.Response.WriteAsync(msg); 33 }); 34 } 35 36 // Entry point for the application. 37 public static void Main(string[] args) => WebApplication.Run<Startup>(args); 38 } 39 }
除非你通過傳入一些不同的配置參數來覆蓋選項,否則靜態檔案會對於一個給定的請求看作是請求路徑。這個請求路徑是相對於檔案系統。
如果靜態檔案根據url找到一個檔案,它將直接返回該檔案,而不調用下一個塊中介軟體。
如果沒有找到匹配的檔案,那麼它會繼續執行下一個塊中介軟體。
讓我們儲存Startup.cs檔案並重新整理瀏覽器。
你現在可以看到index.html檔案。你放置在wwwroot檔案夾下任何地方的任何JavaScript檔案、CSS檔案或者HTML檔案,您都能夠在Asp.Net Core中直接當靜態檔案使用。
在如果你想 讓index.html作為您的預設檔案,IIS一直有這種功能。
你可以給 IIS 一個預設檔案清單。如果有人訪問根目錄,在這種情況下,如果 IIS 找到命名為 index.html的檔案,它就會自動將該檔案返回給用戶端。
讓我們現在開始進行少量更改。首先,我們需要刪除強制的錯誤,然後添加另一塊的中介軟體,這就是 UseDefaultFiles。以下是配置方法的實現。
1 / This method gets called by the runtime. 2 // Use this method to configure the HTTP request pipeline. 3 public void Configure(IApplicationBuilder app) { 4 app.UseIISPlatformHandler(); 5 app.UseDeveloperExceptionPage(); 6 7 app.UseRuntimeInfoPage(); 8 app.UseDefaultFiles(); 9 app.UseStaticFiles(); 10 11 app.Run(async (context) => { 12 var msg = Configuration["message"]; 13 await context.Response.WriteAsync(msg); 14 }); 15 }
這段中介軟體將監聽傳入的請求,如果請求是根目錄,就查看是否有匹配的預設檔案。
您可以覆蓋這個中介軟體的選項來告訴它如何匹配預設檔案,但index.html是預設情況下的一個預設的檔案。
讓我們儲存 Startup.cs 檔案並將您的瀏覽器轉到 web 應用程式的根目錄。
你現在可以看到index.html是預設檔案。你安裝中介軟體的順序是很重要的,因為如果你將UseDefaultFiles放置在UseStaticFiles之後,你將可能不會得到相同的結果。
如果你想要使用UseDefaultFiles和UseStaticFiles中介軟體,你可以使用另一個中介軟體Microsoft.aspnet.staticfiles,它也是NuGet包,它是一個伺服器中介軟體。這本質上是以正確的順序包含了預設檔案和靜態檔案。
1 // This method gets called by the runtime. 2 // Use this method to configure the HTTP request pipeline. 3 public void Configure(IApplicationBuilder app) { 4 app.UseIISPlatformHandler(); 5 app.UseDeveloperExceptionPage(); 6 7 app.UseRuntimeInfoPage(); 8 app. UseFileServer(); 9 10 app.Run(async (context) => { 11 var msg = Configuration["message"]; 12 await context.Response.WriteAsync(msg); 13 }); 14 }
讓我們再一次儲存 Startup.cs 檔案。一旦你重新整理瀏覽器,你將看到相同的結果,如下面的螢幕快照所示。