Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[faq]如何故障排除ASP .NET Core網站啟動失敗問題

[faq]如何故障排除ASP .NET Core網站啟動失敗問題.jpg
圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/

辛辛苦苦開發的Asp .Net Core網站做完了,在local測試也沒什麽問題了,接下來肯定是要發佈到正式機器讓世界看看你的傑作。

但是,當發佈到Azure Web App上面,卻出現了An error occurred while starting the application,然後其他除了執行環境訊息之外什麽訊息都沒有。

這個時候該怎麽辦?我只是想要把網站run起來怎麽那麽困難!!!

這篇將介紹如何偵錯這類的問題。

ASP .NET Core 啟動出錯:An error occurred while starting the application Azure 設定值 看到完整的 ASP .NET Core 啟動錯誤

如何故障排除 ASP.NET Core 網站啟動失敗的訊息

ASP .NET Core 部署上去之後出現錯誤但是看不到訊息怎麼處理?只顯示:An error occurred while starting the application

可以嘗試三個方法:

  1. 切換環境為開發環境:設定ASPNETCORE_ENVIRONMENTDevelopment
  2. 開啓詳細錯誤訊息:設定ASPNETCORE_DETAILEDERRORStrue
  3. 如果網站是host在IIS的話,那麽可以在web.config加入
    
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\codes.dll"
                  stdoutLogEnabled="true" stdoutLogFile=".\logs\stdoutput" />
    </system.webServer>
    
    特別注意,stoutLogFile的資料夾要存在,不存在的話不會有任何log記錄下來。再來是要記得找到問題之後這個要拿掉。

適用於:ASP .NET Core

問題描述

在實際看到解法之前,先來看看看到的問題長什麽樣子。

當把網站實際執行的時候,看到An error occurred while starting the application就是這篇想要解決的問題。

ASP .NET Core 啟動出錯:An error occurred while starting the application
啟動錯誤的截圖

解決方式 - TL;DR

這類問題最大的麻煩是:看不到實際的問題是什麽

因此解決方式也很簡單,只需要讓實際的錯誤訊息顯示出來即可。

但是可以怎麽做呢?有幾個做法:

  1. 切換環境為開發環境:設定ASPNETCORE_ENVIRONMENTDevelopment
  2. 開啓詳細錯誤訊息:設定ASPNETCORE_DETAILEDERRORStrue
  3. 如果網站是host在IIS的話,那麽可以在web.config加入
    
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\codes.dll"
                  stdoutLogEnabled="true" stdoutLogFile=".\logs\stdoutput" />
    </system.webServer>
    
    特別注意,stoutLogFile的資料夾要存在,不存在的話不會有任何log記錄下來。再來是要記得找到問題之後這個要拿掉。

第一個做法,不太建議,原因是當透過切換環境,很有可能有其他的副作用。舉例來説,如果有appsetting.development.json,那麽很有可能因爲環境切換導致設定也被切換,造成問題無法重現。

因此比較建議的方式是用第二種,透過把顯示錯誤訊息打開來看到。

第三種除非沒有任何解決方案,要不然太麻煩。

如果今天是架設在Azure,然後想要透過方法二,那麽可以透過在Application Settings裡面做設定:

Azure 設定值
透過Application Setting
記得儲存完要重啓,有時候儲存完就有效果,但是最肯定就是自己手動重啓。

如果今天是架設在其他地方,那麽只需要可以設定這個key和value到環境變數即可。

都設定完成了之後,在重新瀏覽網站將會看到完整的錯誤訊息,看到訊息應該就會修理了

看到完整的 ASP .NET Core 啟動錯誤
詳細錯誤訊息樣子

如果想要模擬重現這個問題,可以往下看

重現問題

這邊可以非常簡單模擬出這個問題,只需要:

建立一個Asp .Net Core的web專案

Visual Studio建立一個Asp .NET Core的web 專案,我這邊選擇了一個Web API的範本

devenv_2019-03-19_21-47-17.png
Web API範本的專案
Startup.cs裡面丟一個exception

這邊選擇在最下面的Configure方法裡面,在結束前加上一個 throw new Exception()


加入故意炸掉的邏輯

結語

當網站啟動的時候出現錯誤不用擔心,只需要透過設定環境變數ASPNETCORE_DETAILEDERRORStrue就可以了。

當然,最好還是程式裡面有完整的log機制,最好只要透過查log記錄就可以找到問題。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus