本篇文章將簡單說明 ASP.NET Core 與過去 ASP.NET 網頁應用程式在 檢視詳細錯誤訊息設定 上有什麼不同,並簡單介紹 ASP.NET Core 網頁應用程式佈署至 IIS 上時,如何檢視詳細錯誤訊息。本篇文章若有任何問題或錯誤,請各位前輩不吝提出,謝謝。


注意!! 正確的方式應該是將錯誤訊息以 Log 方式記錄,而不是顯示網頁上,本篇文章意旨說明相關設定與短時程解決方法。




以前,若想要檢視 IIS 上的 ASP.NET (.NET Framework) 網頁應用程式時,你可以設定 Web.config 內 customErrors 內的 mode 值為 off (或 RemoteOnly 在本地檢視詳細錯誤) 即可,如下列程式碼


<customErrors>
<customErrors mode="Off">
</customErrors>
view raw web.config hosted with ❤ by GitHub



 ASP.NET Core 網頁應用程式在 IIS 上已經不會存取  system.web 內任何設定,所以無法透過 customErrors 來檢視詳細錯誤訊息。如果遇到在開發環境正常,在正式環境遇到問題,那該怎麼辦呢 ?  


錯誤發生時,隱藏詳細錯誤訊息


錯誤發生時,顯示詳細錯誤訊息




這邊列出了幾個短期解決方法提供參考:

1. 修改 Startup.cs 程式:不分環境一律使用 app.UseDeveloperExceptionPage();
2. 修改環境變數  ASPNETCORE_ENVIRONMENT 為 Development
3. 在 appsetting.json 內設定一個開關,可以手動開關詳細錯誤訊息





修改 Startup.cs 程式:不分環境一律使用 app.UseDeveloperExceptionPage()

您能開啟 Startup.cs ,找到 Configure 方法。您能看見只有 env.IsDevelopment() 為 Ture 的情況下才會顯示詳細錯誤訊息 (意思是 ASPNETCORE_ENVIRONMENT 為 Development 才會顯示)。您可以把 app.UseDeveloperExceptionPage(); 移出環境的 if 判斷,如此一來,任何環境都會顯示錯誤訊息。


這樣做的缺點是:

1. 需要重新編譯與佈署網站 (影響線上使用者)
2. 處理完問題後,需要還原並重新佈署,避免正式環境錯誤訊息外洩造成資安問題






修改環境變數  ASPNETCORE_ENVIRONMENT 為 Development

你可以直接修改該主機環境變數: ASPNETCORE_ENVIRONMENT 為 Development,或直接在 web.config 上進行修改 environmentVariable,意思將該 IIS 的環境轉換成開發環境,在不需要修改程式的情況下,即可檢視錯誤訊息。


這樣做的缺點是

1. 若你修改作業系統的環境變數,你可能需要重新啟動該主機
2. 若你修改 web.config 的環境變數,網站應用程式集區會自動回收,影響線上使用者
3. 應用程式會改讀取 appsetting.Development.json 設定檔案,影響正式環境運作




參考設定如下 (方便您直接複製修改)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\CustomerErrorTest.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" >
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
</configuration>
view raw web.config hosted with ❤ by GitHub




在 appsetting.json 內設定一個開關,可以手動開關詳細錯誤訊息

主要想法是在 appsetting.json 設定檔案內加一個設定值,可以隨時開關詳細錯誤訊息,如此一來,未來遇到問題時,不需要修改環境變數,也不需要重新編譯與佈署網站,即可隨時檢視錯誤訊息。


這樣做的缺點是

1. 第一次仍要修改程式與重新佈署
2. 修改 appsetting.json 檔案時仍會造成網站應用程式集區會自動回收,影響線上使用者
3. 開發人員容易忘記關掉,詳細錯誤訊息曝光
4. 養成開發人員壞習慣,要看 log 時仍要遠端到主機進行設定 (有遠端的情境容易有資安問題,個人還是強烈建議使用自動化程序,而非手動修改)


做法如下:

Step 1. 在 appsetting.json 內加上一個 EnableErrorDetail : true 的設定值




Step 2. 開啟 Startup.cs ,找到 Configure 方法。我們將檢視 appsetting.json 內的設定,來決定是否顯示詳細錯誤訊息,修改內容如下紅色框框處:




public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
if (Configuration.GetValue<bool>("EnableErrorDetail") == true)
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
view raw Startup.cs hosted with ❤ by GitHub




上述三種方案皆不是最好的解決方法 (皆會影響正式環境運作),若您身為技術主管、Team Leader 或資深工程師,應該要建立對團隊較好的錯誤訊息處理機制,如:使用 application performance monitor 內的 log 收集與警示功能,即時發現正式環境問題並進行排除,才是比較好的方式。