本篇文章將簡單說明 ASP.NET Core 與過去 ASP.NET 網頁應用程式在 檢視詳細錯誤訊息設定 上有什麼不同,並簡單介紹 ASP.NET Core 網頁應用程式佈署至 IIS 上時,如何檢視詳細錯誤訊息。本篇文章若有任何問題或錯誤,請各位前輩不吝提出,謝謝。
注意!! 正確的方式應該是將錯誤訊息以 Log 方式記錄,而不是顯示網頁上,本篇文章意旨說明相關設定與短時程解決方法。
以前,若想要檢視 IIS 上的 ASP.NET (.NET Framework) 網頁應用程式時,你可以設定 Web.config 內 customErrors 內的 mode 值為 off (或 RemoteOnly 在本地檢視詳細錯誤) 即可,如下列程式碼
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 設定檔案,影響正式環境運作
在 appsetting.json 內設定一個開關,可以手動開關詳細錯誤訊息
主要想法是在 appsetting.json 設定檔案內加一個設定值,可以隨時開關詳細錯誤訊息,如此一來,未來遇到問題時,不需要修改環境變數,也不需要重新編譯與佈署網站,即可隨時檢視錯誤訊息。
這樣做的缺點是
1. 第一次仍要修改程式與重新佈署
2. 修改 appsetting.json 檔案時仍會造成網站應用程式集區會自動回收,影響線上使用者
3. 開發人員容易忘記關掉,詳細錯誤訊息曝光
4. 養成開發人員壞習慣,要看 log 時仍要遠端到主機進行設定 (有遠端的情境容易有資安問題,個人還是強烈建議使用自動化程序,而非手動修改)
做法如下:
Step 1. 在 appsetting.json 內加上一個 EnableErrorDetail : true 的設定值
Step 2. 開啟 Startup.cs ,找到 Configure 方法。我們將檢視 appsetting.json 內的設定,來決定是否顯示詳細錯誤訊息,修改內容如下紅色框框處:
上述三種方案皆不是最好的解決方法 (皆會影響正式環境運作),若您身為技術主管、Team Leader 或資深工程師,應該要建立對團隊較好的錯誤訊息處理機制,如:使用 application performance monitor 內的 log 收集與警示功能,即時發現正式環境問題並進行排除,才是比較好的方式。
0 留言