添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

這是開發 ASP.NET 網站可能遇到的問題:當類別的靜態建構式、靜態欄位初始化出錯,將導致 TypeInitializationException 「'XXXX' 的類型初始設定式發生例外狀況。 The type initializer for 'XXXX' threw an exception.」錯誤。一旦發生,即使修正錯誤來源,靜態建構式、靜態屬性也不會重新執行,呼叫相關方法會得到相同例外(可想像成一直傳回被 Cache 的 TypeInitializationException),有時會讓人混淆,例如:缺少的檔案、Registry 明明已經補上,為什麼系統還是一直抱怨找不到?

用一個範例來重現問題。我在 IIS 開了一個 ASP.NET Web Site 應用程式 - MyWebSite,App_Code/AppUtil.cs 的靜態建構式會由 ~/secret.txt 讀取字串,之後透過 public static string GetSecret() 方法供外界讀取。(註:為便於觀察,讀檔動作加了 try catch 在錯誤訊息加註時間戳記。)

using System;
using System.Web.Hosting;
using System.IO;
public class AppUtil
    static string _secret;
    static AppUtil()
            _secret = File.ReadAllText(
                HostingEnvironment.MapPath("~/secret.txt"));
        catch (Exception ex) 
            throw new ApplicationException(ex.Message + "/" + 
                DateTime.Now.ToString("HH:mm:ss.fff"));
    public static string GetSecret()
        return _secret;

測試網頁 default.aspx 如下:

<%@ Page Language="C#" %>
<script runat="server">
    void Page_Load(object sender, EventArgs e)
        Response.ContentType = "text/plain";
            var secret = AppUtil.GetSecret();
            Response.Write("Secret = " + secret);
        catch (Exception ex)
            Response.Write(ex.GetType().ToString() + ":\n");
            Response.Write(ex.Message + "\n");
            if (ex.InnerException != null) 
                Response.Write(ex.InnerException.Message + "\n");
            Response.Write(DateTime.Now.ToString("HH:mm:ss.fff") + "\n");
</script>

開始測試時 secret.txt 不存在,呼叫 default.aspx 不意外地得到錯誤:

System.TypeInitializationException:
'AppUtil' 的類型初始設定式發生例外狀況。
找不到檔案 'C:\WWW\MyWebSite\secret.txt'。