ASP.NET Core處理錯(cuò)誤環(huán)境
1.前言
ASP.NET Core處理錯(cuò)誤環(huán)境區(qū)分為兩種:開(kāi)發(fā)環(huán)境和非開(kāi)發(fā)環(huán)境。
- 開(kāi)發(fā)環(huán)境:開(kāi)發(fā)人員異常頁(yè)。
- 非開(kāi)發(fā)環(huán)境:異常處理程序頁(yè)、狀態(tài)代碼頁(yè)。
在Startup.Configure方法里面我們會(huì)看到如下代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { //開(kāi)發(fā)環(huán)境 } else { //非開(kāi)發(fā)環(huán)境 } }
env.IsDevelopment()是判斷應(yīng)用程序運(yùn)行是在開(kāi)發(fā)環(huán)境還是非開(kāi)發(fā)環(huán)境,具體配置在Properties/launchSettings.json,找到ASPNETCORE_ENVIRONMENT屬性,默認(rèn)值是開(kāi)發(fā)環(huán)境(Development),具體環(huán)境配置知識(shí)點(diǎn)后面我們?cè)賮?lái)學(xué)習(xí)下。
2.開(kāi)發(fā)人員異常頁(yè)
向Startup.Configure方法添加代碼,以當(dāng)應(yīng)用在開(kāi)發(fā)環(huán)境中運(yùn)行時(shí)啟用此頁(yè):
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
開(kāi)發(fā)人員異常頁(yè)僅當(dāng)應(yīng)用程序在開(kāi)發(fā)環(huán)境中運(yùn)行時(shí)才會(huì)啟用,而且調(diào)用UseDeveloperExceptionPage要配置于任何要捕獲其異常的中間件前面。
該頁(yè)包括關(guān)于異常和請(qǐng)求的以下信息:
- 堆棧跟蹤
- 查詢(xún)字符串參數(shù)(如果有)
- Cookie(如果有)
- request header
3.異常處理程序頁(yè)
在下面的示例中,UseExceptionHandler 在非開(kāi)發(fā)環(huán)境中添加異常處理中間件:
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); }
Razor Pages應(yīng)用模板提供“頁(yè)面”文件夾中的Error頁(yè)(.cshtml)和PageModel類(lèi)(ErrorModel)。 對(duì)于MVC應(yīng)用,項(xià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)修飾錯(cuò)誤處理程序操作方法,因?yàn)闀?huì)阻止某些請(qǐng)求訪(fǎng)問(wèn)的方法。同時(shí)最好允許匿名訪(fǎng)問(wèn)方法,以便未經(jīng)身份驗(yàn)證的用戶(hù)能夠接收錯(cuò)誤視圖。
UseExceptionHandler中間還可以使用lambda進(jìn)行異常處理:
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)代碼頁(yè)
一般情況下,ASP.NET Core應(yīng)用程序不會(huì)為HTTP狀態(tài)代碼(如“404-未找到”)提供狀態(tài)代碼頁(yè)的。但若要提供狀態(tài)代碼頁(yè),可以使用狀態(tài)代碼頁(yè)中間件。
4.1 UseStatusCodePages中間件
若要啟用常見(jiàn)錯(cuò)誤狀態(tài)代碼的默認(rèn)純文本處理程序,請(qǐng)?jiān)赟tartup.Configure方法中調(diào)用 UseStatusCodePages:
app.UseStatusCodePages();
而這里有一點(diǎn)要注意的是,調(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?}"); });
下面通過(guò)運(yùn)行應(yīng)用程序在瀏覽器地址欄上輸入一個(gè)不存在地址看看配置該中間件后的效果:
很顯然當(dāng)我們輸入一個(gè)不存在地址之后就會(huì)打開(kāi)一個(gè)處理錯(cuò)誤的狀態(tài)代碼頁(yè)。
UseStatusCodePages中間件還有兩種重載使用方法,具體運(yùn)行效果就不一一截圖了,大家自行測(cè)試。
- 包含格式字符串的 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中間件
- 向客戶(hù)端發(fā)送“302 - 已找到”狀態(tài)代碼。
- 將客戶(hù)端重定向到URL模板中的位置。
下面我們?cè)赟tartup.Configure方法中調(diào)用UseStatusCodePagesWithRedirect:
app.UseStatusCodePagesWithRedirects("/Error/{0}");
運(yùn)行應(yīng)用程序在瀏覽器上輸入不存在地址https://localhost:44353/1看看配置該中間件后的效果,你會(huì)發(fā)覺(jué)當(dāng)我們輸入上述地址后會(huì)跳轉(zhuǎn)到https://localhost:44353/Error/404鏈接去了,并顯示:
這就說(shuō)明白當(dāng)我們輸入一個(gè)不存在地址之后會(huì)重定向中間件設(shè)置的地址頁(yè)面去了。
到此這篇關(guān)于A(yíng)SP.NET Core處理錯(cuò)誤環(huán)境的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 理解ASP.NET?Core?錯(cuò)誤處理機(jī)制(Handle?Errors)
- ASP.NET Core應(yīng)用錯(cuò)誤處理之StatusCodePagesMiddleware中間件針對(duì)響應(yīng)碼呈現(xiàn)錯(cuò)誤頁(yè)面
- ASP.NET Core應(yīng)用錯(cuò)誤處理之ExceptionHandlerMiddleware中間件呈現(xiàn)“定制化錯(cuò)誤頁(yè)面”
- ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開(kāi)發(fā)者異常頁(yè)面”
- ASP.NET Core應(yīng)用錯(cuò)誤處理之三種呈現(xiàn)錯(cuò)誤頁(yè)面的方式
- ASP.NET Core異常和錯(cuò)誤處理(8)
- 在A(yíng)SP.NET Core中顯示自定義的錯(cuò)誤頁(yè)面
相關(guān)文章
服務(wù)器讀取EXCEL不安裝OFFICE如何實(shí)現(xiàn)
用asp.net做了一簡(jiǎn)單的游戲管理后臺(tái),涉及到了上傳Excel導(dǎo)入數(shù)據(jù)的功能,在本地開(kāi)發(fā)實(shí)現(xiàn)都好好的,可已上傳的服務(wù)器上就悲劇了,下面有個(gè)不錯(cuò)的解決方法,大家可以參考下2014-03-03基于.NET BitmapImage 內(nèi)存釋放問(wèn)題的解決方法詳解
本篇文章是對(duì).NET BitmapImage 內(nèi)存釋放問(wèn)題的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)顯示文章列表(九)
顯示文章列表分兩塊,管理員可以顯示全部文章列表,一般用戶(hù)只顯示自己的文章列表。文章列表的顯示采用easyui-datagrid,后臺(tái)需要與之對(duì)應(yīng)的action返回json類(lèi)型數(shù)據(jù),感興趣的小伙伴們可以參考一下2015-09-09利用ASP.Net?Core中的Razor實(shí)現(xiàn)動(dòng)態(tài)菜單
這篇文章主要介紹了如何利用ASP.Net?Core中的Razor實(shí)現(xiàn)動(dòng)態(tài)菜單功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04Asp.net給站點(diǎn)某目錄增加Aspnet用戶(hù)
Asp.net給站點(diǎn)某目錄增加Aspnet用戶(hù)...2006-09-09詳解ASP.NET Core 之 Identity 入門(mén)(三)
本篇文章主要介紹了ASP.NET Core 之 Identity 入門(mén),主要負(fù)責(zé)對(duì)用戶(hù)的身份進(jìn)行認(rèn)證,有興趣的可以了解一下。2016-12-12ASP.NET中實(shí)現(xiàn)導(dǎo)出ppt文件數(shù)據(jù)的實(shí)例分享
這篇文章主要介紹了ASP.NET中實(shí)現(xiàn)導(dǎo)出ppt文件數(shù)據(jù)的實(shí)例分享,實(shí)例代碼用C#語(yǔ)言編寫(xiě),利用.NET的庫(kù)實(shí)現(xiàn)起來(lái)還是比較簡(jiǎn)潔的,需要的朋友可以參考下2016-02-02關(guān)于A(yíng)SP.NET頁(yè)面打印技術(shù)的常用方法總結(jié)
B/S結(jié)構(gòu)導(dǎo)致了Web應(yīng)用程序中打印的特殊性;程序運(yùn)行在瀏覽器中,打印機(jī)在本地,而文件確可能在服務(wù)器上,導(dǎo)致了打印控制不是很靈活,接下來(lái)介紹幾種常見(jiàn)的打印技術(shù),感興趣的朋友可以了解下2013-01-01MVC使用極驗(yàn)驗(yàn)證制作登錄驗(yàn)證碼學(xué)習(xí)筆記7
這篇文章主要介紹了MVC使用極驗(yàn)驗(yàn)證制作登錄驗(yàn)證碼學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09