首頁 > 軟體

ASP.NET Core處理錯誤環境

2022-04-06 19:02:06

1.前言

ASP.NET Core處理錯誤環境區分為兩種:開發環境和非開發環境。

  • 開發環境:開發人員異常頁。
  • 非開發環境:例外處理程式頁、狀態內碼錶。

在Startup.Configure方法裡面我們會看到如下程式碼:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
       //開發環境
    } 
    else
    {
       //非開發環境
    }
}

env.IsDevelopment()是判斷應用程式執行是在開發環境還是非開發環境,具體設定在Properties/launchSettings.json,找到ASPNETCORE_ENVIRONMENT屬性,預設值是開發環境(Development),具體環境設定知識點後面我們再來學習下。

2.開發人員異常頁

向Startup.Configure方法新增程式碼,以當應用在開發環境中執行時啟用此頁:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}

開發人員異常頁僅當應用程式在開發環境中執行時才會啟用,而且呼叫UseDeveloperExceptionPage要設定於任何要捕獲其異常的中介軟體前面。
該頁包括關於異常和請求的以下資訊:

  • 堆疊跟蹤
  • 查詢字串引數(如果有)
  • Cookie(如果有)
  • request header

3.例外處理程式頁

在下面的範例中,UseExceptionHandler 在非開發環境中新增例外處理中介軟體:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

Razor Pages應用模板提供“頁面”資料夾中的Error頁(.cshtml)和PageModel類(ErrorModel)。 對於MVC應用,專案模板包括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)修飾錯誤處理程式操作方法,因為會阻止某些請求存取的方法。同時最好允許匿名存取方法,以便未經身份驗證的使用者能夠接收錯誤檢視。
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>rn");
            await context.Response.WriteAsync("ERROR!<br><br>rn");
            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>rn");
            }
            await context.Response.WriteAsync("<a href="/">Home</a><br>rn");
            await context.Response.WriteAsync("</body></html>rn");
            await context.Response.WriteAsync(new string(' ', 512)); // IE padding
        });
    });
app.UseHsts();
}

4.狀態內碼錶

一般情況下,ASP.NET Core應用程式不會為HTTP狀態程式碼(如“404-未找到”)提供狀態內碼錶的。但若要提供狀態內碼錶,可以使用狀態內碼錶中介軟體。

4.1 UseStatusCodePages中介軟體

若要啟用常見錯誤狀態程式碼的預設純文書處理程式,請在Startup.Configure方法中呼叫 UseStatusCodePages:

app.UseStatusCodePages();

而這裡有一點要注意的是,呼叫UseStatusCodePages中介軟體要在例如靜態檔案中介軟體和 MVC中介軟體等中介軟體前面呼叫:

app.UseStatusCodePages();
app.UseStaticFiles();
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

下面通過執行應用程式在瀏覽器位址列上輸入一個不存在地址看看設定該中介軟體後的效果:

很顯然當我們輸入一個不存在地址之後就會開啟一個處理錯誤的狀態內碼錶。
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中介軟體

  • 向用戶端傳送“302 - 已找到”狀態程式碼。
  • 將使用者端重定向到URL模板中的位置。

下面我們在Startup.Configure方法中呼叫UseStatusCodePagesWithRedirect:

app.UseStatusCodePagesWithRedirects("/Error/{0}");

執行應用程式在瀏覽器上輸入不存在地址https://localhost:44353/1看看設定該中介軟體後的效果,你會發覺當我們輸入上述地址後會跳轉到https://localhost:44353/Error/404連結去了,並顯示:

這就說明白當我們輸入一個不存在地址之後會重定向中介軟體設定的地址頁面去了。

到此這篇關於ASP.NET Core處理錯誤環境的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com