ASP.NET Core處理錯誤環(huán)境
1.前言
ASP.NET Core處理錯誤環(huán)境區(qū)分為兩種:開發(fā)環(huán)境和非開發(fā)環(huán)境。
- 開發(fā)環(huán)境:開發(fā)人員異常頁。
- 非開發(fā)環(huán)境:異常處理程序頁、狀態(tài)代碼頁。
在Startup.Configure方法里面我們會看到如下代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
//開發(fā)環(huán)境
}
else
{
//非開發(fā)環(huán)境
}
}env.IsDevelopment()是判斷應(yīng)用程序運行是在開發(fā)環(huán)境還是非開發(fā)環(huán)境,具體配置在Properties/launchSettings.json,找到ASPNETCORE_ENVIRONMENT屬性,默認(rèn)值是開發(fā)環(huán)境(Development),具體環(huán)境配置知識點后面我們再來學(xué)習(xí)下。
2.開發(fā)人員異常頁
向Startup.Configure方法添加代碼,以當(dāng)應(yīng)用在開發(fā)環(huán)境中運行時啟用此頁:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}開發(fā)人員異常頁僅當(dāng)應(yīng)用程序在開發(fā)環(huán)境中運行時才會啟用,而且調(diào)用UseDeveloperExceptionPage要配置于任何要捕獲其異常的中間件前面。
該頁包括關(guān)于異常和請求的以下信息:
- 堆棧跟蹤
- 查詢字符串參數(shù)(如果有)
- Cookie(如果有)
- request header
3.異常處理程序頁
在下面的示例中,UseExceptionHandler 在非開發(fā)環(huán)境中添加異常處理中間件:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}Razor Pages應(yīng)用模板提供“頁面”文件夾中的Error頁(.cshtml)和PageModel類(ErrorModel)。 對于MVC應(yīng)用,項目模板包括Error操作方法和Error視圖。操作方法如下:
[AllowAnonymous]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}不要使用HTTP方法屬性(如HttpGet)修飾錯誤處理程序操作方法,因為會阻止某些請求訪問的方法。同時最好允許匿名訪問方法,以便未經(jīng)身份驗證的用戶能夠接收錯誤視圖。
UseExceptionHandler中間還可以使用lambda進行異常處理:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = 500;
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
await context.Response.WriteAsync("ERROR!<br><br>\r\n");
var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>();
// Use exceptionHandlerPathFeature to process the exception (for example,
// logging), but do NOT expose sensitive error information directly to
// the client.
if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
await context.Response.WriteAsync("File error thrown!<br><br>\r\n");
}
await context.Response.WriteAsync("<a href=\"/\">Home</a><br>\r\n");
await context.Response.WriteAsync("</body></html>\r\n");
await context.Response.WriteAsync(new string(' ', 512)); // IE padding
});
});
app.UseHsts();
}4.狀態(tài)代碼頁
一般情況下,ASP.NET Core應(yīng)用程序不會為HTTP狀態(tài)代碼(如“404-未找到”)提供狀態(tài)代碼頁的。但若要提供狀態(tài)代碼頁,可以使用狀態(tài)代碼頁中間件。
4.1 UseStatusCodePages中間件
若要啟用常見錯誤狀態(tài)代碼的默認(rèn)純文本處理程序,請在Startup.Configure方法中調(diào)用 UseStatusCodePages:
app.UseStatusCodePages();
而這里有一點要注意的是,調(diào)用UseStatusCodePages中間件要在例如靜態(tài)文件中間件和 MVC中間件等中間件前面調(diào)用:
app.UseStatusCodePages();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});下面通過運行應(yīng)用程序在瀏覽器地址欄上輸入一個不存在地址看看配置該中間件后的效果:

很顯然當(dāng)我們輸入一個不存在地址之后就會打開一個處理錯誤的狀態(tài)代碼頁。
UseStatusCodePages中間件還有兩種重載使用方法,具體運行效果就不一一截圖了,大家自行測試。
- 包含格式字符串的 UseStatusCodePages:
app.UseStatusCodePages("text/plain", "Status code page, status code: {0}");- 包含lambda的UseStatusCodePages:
app.UseStatusCodePages(async context =>
{
context.HttpContext.Response.ContentType = "text/plain";
await context.HttpContext.Response.WriteAsync(
"Status code page, status code: " +
context.HttpContext.Response.StatusCode);
});4.2 UseStatusCodePagesWithRedirect中間件
- 向客戶端發(fā)送“302 - 已找到”狀態(tài)代碼。
- 將客戶端重定向到URL模板中的位置。
下面我們在Startup.Configure方法中調(diào)用UseStatusCodePagesWithRedirect:
app.UseStatusCodePagesWithRedirects("/Error/{0}");運行應(yīng)用程序在瀏覽器上輸入不存在地址https://localhost:44353/1看看配置該中間件后的效果,你會發(fā)覺當(dāng)我們輸入上述地址后會跳轉(zhuǎn)到https://localhost:44353/Error/404鏈接去了,并顯示:

這就說明白當(dāng)我們輸入一個不存在地址之后會重定向中間件設(shè)置的地址頁面去了。
到此這篇關(guān)于ASP.NET Core處理錯誤環(huán)境的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 理解ASP.NET?Core?錯誤處理機制(Handle?Errors)
- ASP.NET Core應(yīng)用錯誤處理之StatusCodePagesMiddleware中間件針對響應(yīng)碼呈現(xiàn)錯誤頁面
- ASP.NET Core應(yīng)用錯誤處理之ExceptionHandlerMiddleware中間件呈現(xiàn)“定制化錯誤頁面”
- ASP.NET Core應(yīng)用錯誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者異常頁面”
- ASP.NET Core應(yīng)用錯誤處理之三種呈現(xiàn)錯誤頁面的方式
- ASP.NET Core異常和錯誤處理(8)
- 在ASP.NET Core中顯示自定義的錯誤頁面
相關(guān)文章
.NET實現(xiàn)熱插拔功能(動態(tài)替換功用)方案實例
如果某個"功能"需要動態(tài)更新?這種動態(tài)更新,可能是需求驅(qū)動的,也可能是為了修改 BUG,面對這種場景,如何實現(xiàn)“熱插拔”呢?先解釋一下“熱插拔”:在系統(tǒng)運行過程動態(tài)替換某些功能,不用重啟系統(tǒng)進程。下面看例子2013-11-11
asp.net正則表達(dá)式刪除指定的HTML標(biāo)簽的代碼
抓取某網(wǎng)頁的數(shù)據(jù)后(比如描述),如果照原樣顯示的話,可能會因為它里面包含沒有閉合的HTML標(biāo)簽而打亂了格式,也可能它里面用了比較讓人 費解 的HTML標(biāo)簽,把預(yù)訂的格式攪亂.2010-09-09
設(shè)置ASP.NET頁面的運行超時時間詳細(xì)到單個頁面及站點
這篇文章主要介紹了如何設(shè)置ASP.NET頁面的運行超時時間,包括全局超時時間、單個站點超時時間、單個頁面請求超時時間,需要的朋友可以參考下2014-06-06
DataGridView中綁定DataTable數(shù)據(jù)及相關(guān)操作實現(xiàn)代碼
DataGridView中綁定DataTable數(shù)據(jù)及相關(guān)操作2010-02-02
asp.net代碼中修改web.config節(jié)點的具體方法
在有些情況下,要在代碼中讀取一種全局變量,把這種全局變量放在web.config是一種常見的手段。2013-06-06
剖析Asp.Net Web API路由系統(tǒng)---WebHost部署方式
這篇文章主要介紹了剖析Asp.Net Web API路由系統(tǒng)---WebHost部署方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02

