網(wǎng)站首頁 編程語言 正文
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屬性,默認值是開發(fā)環(huán)境(Development),具體環(huán)境配置知識點后面我們再來學習下。
2.開發(fā)人員異常頁
向Startup.Configure方法添加代碼,以當應(yīng)用在開發(fā)環(huán)境中運行時啟用此頁:
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
開發(fā)人員異常頁僅當應(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("\r\n"); await context.Response.WriteAsync("ERROR!
\r\n"); var exceptionHandlerPathFeature = context.Features.Get(); // 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!
\r\n"); } await context.Response.WriteAsync("Home
\r\n"); await context.Response.WriteAsync("\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)代碼的默認純文本處理程序,請在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)用程序在瀏覽器地址欄上輸入一個不存在地址看看配置該中間件后的效果:
很顯然當我們輸入一個不存在地址之后就會打開一個處理錯誤的狀態(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ā)覺當我們輸入上述地址后會跳轉(zhuǎn)到https://localhost:44353/Error/404鏈接去了,并顯示:
這就說明白當我們輸入一個不存在地址之后會重定向中間件設(shè)置的地址頁面去了。
原文鏈接:https://www.cnblogs.com/wzk153/p/10950702.html
相關(guān)推薦
- 2021-12-09 Android音頻開發(fā)之錄制音頻(WAV及MP3格式)_Android
- 2021-12-02 Postman?使用指南及小技巧_相關(guān)技巧
- 2022-10-29 關(guān)于torch.load加載預(yù)訓練模型時 造成的 臨時分配的顯存 不釋放
- 2023-03-20 Linq利用Distinct去除重復(fù)項問題(可自己指定)_C#教程
- 2024-01-06 RocketMQ消息丟失問題
- 2022-06-20 k8s在go語言中的使用及client?初始化簡介_Golang
- 2022-09-23 Matlab幾個常用的繪圖顏色搭配推薦_相關(guān)技巧
- 2022-04-15 C++中構(gòu)造函數(shù)詳解_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支