萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> asp編程 >> 如何在ASP.NET應用程序中初始化

如何在ASP.NET應用程序中初始化

每個程序都需要初始化的過程,用來讀取配置或者設置一些運行環境(變量),對於ASP.NET程序來說,又該在哪裡執行初始化的任務呢?

我想應該絕大多數人都知道在Global.asax中執行初始化的過程,然而有些細節是我們需要關注的。

本文用例

在這篇博客的示例代碼中,AppInitializer包含了網站的初始化的實現代碼:

  1. public static class AppInitializer  
  2. {  
  3.     public static ConnectionStringSettings MyNorthwindConnectionSetting { get; private set; }  
  4.  
  5.     public static void Init()  
  6.     {  
  7.         // 讀取連接字符串。  
  8.         LoadConnectionString();  
  9.  
  10.         // 設置SQLSERVER緩存依賴通知。  
  11.         SetSqlDependency();  
  12.  
  13.         // 其它的初始化操作。  
  14.         OthersInit();  
  15.     }  
  16.  
  17.     static void LoadConnectionString()  
  18.     {  
  19.         ConnectionStringSettings setting = ConfigurationManager.ConnectionStrings["MyNorthwind"];  
  20.         if( setting == null )  
  21.             throw new ConfigurationException("沒有配置MyNorthwind連接字符串。");  
  22.  
  23.         if( string.IsNullOrEmpty(setting.ConnectionString) )  
  24.             throw new ConfigurationException("沒有為MyNorthwind連接字符串指定內容。");  
  25.  
  26.         if( string.IsNullOrEmpty(setting.ProviderName) )  
  27.             throw new ConfigurationException("沒有為MyNorthwind連接字符串指定ProviderName 。");  
  28.  
  29.         // 保存讀取到的連接字符串,供程序使用。  
  30.         MyNorthwindConnectionSetting = setting;  
  31.     }  
  32.  
  33.     static void SetSqlDependency()  
  34.     {  
  35.         // 判斷SQLSERVER版本是否為 2005以上版本,  
  36.         // 是否開啟Service Broker的檢查代碼就不列出了。  
  37.  
  38.         SqlDependency.Start(MyNorthwindConnectionSetting.ConnectionString);  
  39.     }  
  40.  
  41.     static void OthersInit()  
  42.     {  
  43.         // 其它的初始化操作。  
  44.  
  45.         // 例如:  
  46.         // 1. 加載必要的緩存數據。  
  47.         // 2. 檢查上傳目錄是不存在。  
  48.         // 3. ...................  
  49.     }  

這段代碼的意圖很清楚,一定要確保正確的配置了數據庫連接字符串,否則以異常的形式報告出來。

示例程序還有一個頁面,Default.aspx

  1. <body> 
  2.     <form id="form1" runat="server"> 
  3.     <div> 
  4.         <h1>User Login</h1> 
  5.     </div> 
  6.  
  7.         <p style="line-height: 150%;"> 
  8.             UserName: <asp:TextBox ID="txtUserName" runat="server" Width="200px" Text="Fish Li"></asp:TextBox><br /> 
  9.             Password: <asp:TextBox ID="txtPassword" runat="server" Width="200px" TextMode="Password"></asp:TextBox><br /> 
  10.             <asp:Button ID="btnLogin" runat="server" Text="登錄" OnClick="btnLogin_Click" /> 
  11.         </p> 
  12.     </form> 
  13. </body> 

其實就是一個登錄頁面,後台代碼為:

  1. protected void btnLogin_Click(object sender, EventArgs e)  
  2. {  
  3.     bool ok = false;  
  4.  
  5.     using( SqlConnection connection  
  6.         = new SqlConnection(AppInitializer.MyNorthwindConnectionSetting.ConnectionString) ) {  
  7.  
  8.         connection.Open();  
  9.  
  10.         // 其它的數據庫操作。  
  11.  
  12.         ok = true;  
  13.     }  
  14.  
  15.     if( ok )  
  16.         Response.Redirect("Default2.aspx");  

你沒有想到的Global.asax怪事!

或許有些人會這樣寫他們的初始化代碼:

  1. void Application_Start(object sender, EventArgs e)  
  2. {  
  3.     //在應用程序啟動時運行的代碼  
  4.     try {  
  5.         AppInitializer.Init();  
  6.     }  
  7.     catch( Exception ex ) {  
  8.         LogException(ex);  
  9.           
  10.         // .....................  
  11.     }  
  12. }  

這段代碼有什麼問題呢?

其實問題的線索在於:為什麼要加try....catch語句,是因為知道可能會發生異常嗎?

如果真有異常情況發生,這樣處理後,後續的請求是不是會發生各種想像不到的錯誤?

顯然這裡不能吃掉異常,要不然後面的請求肯定會有問題,因為它們依賴的設置沒有正確的初

copyright © 萬盛學電腦網 all rights reserved