1. 程式人生 > >ASP.NET專案中bin,app_code,app_data 等資料夾的作用

ASP.NET專案中bin,app_code,app_data 等資料夾的作用

1.  Bin資料夾

Bin資料夾包含應用程式所需的,用於控制元件、元件或者需要引用的任何其他程式碼的可部署程式集。該目錄中存在的任何.dll文  件將自動地連結到應用程式。如果在該資料夾中留有不用的或過期的檔案,則可能出現“二義性引用(ambiguous  reference)”異常的風險。換句話說,如果兩個不同的程式集定義相同的類(相同的名稱空間和名稱),則ASP.NET執行庫不能決定應該使用哪一  個程式集,從而丟擲一個異常。在開發時,當我們重新命名一個專案或一個程式集的名稱時,這是常見的錯誤。為了避免這種錯誤,一定不要在該資料夾中保留任何  不必要的程式集,或者至少要從配置檔案的<assemblies>節中刪除如下程式碼行:

<add  assembly="*"  />

在表1.10所列的所有資料夾中,只有Bin可以被ASP.NET  1.x應用程式識別。該資料夾是強制性的。

2.  App_Browser資料夾

該可選的資料夾包含.browser檔案。.browser檔案描述瀏覽器(不管是移動裝置瀏覽器,還是桌上型電腦瀏覽器)的特  徵和功能。ASP.NET在安裝路徑下的Config/Browser資料夾中安裝了大量.browser檔案,這些檔案供所有應用程式共享。我們只是把  當前應用程式特有的瀏覽器檔案放在App_Browser資料夾下。.browser檔案的內容即時動態地進行編譯,以便向ASP.NET執行庫提供最新  的瀏覽器資訊。

讓我們簡單談談擁有一個自定義的.browser檔案可能有幫助的場景。設想應用程式使用了一個在某個瀏覽器下不能有效呈現的控制元件。在指定的瀏覽器中顯示宿主頁面時,可以編寫一個.browser檔案,迫使ASP.NET使用一個不同的介面卡來生成該控制元件。

<browsers>

<browser  id="browserID">

<controlAdapters>

<adapter  controlType="Samples.CustomControl"

adapterType="Samples.Adapters.CustomControlAdapter"  />

</controlAdapters>

</browser>

</browsers>

假設browserID與ASP.NET識別的標準瀏覽器之一相匹配,則上文所示的.browser檔案指示在指定的瀏覽器下使用CustomControlAdapter呈現CustomControl。

3.  App_Code資料夾

App_Code資料夾正好在Web應用程式根目錄下,其儲存所有應當作為應用程式的一部分動態編譯的類檔案。這些類檔案自  動連結到應用程式,而不需要在頁面中新增任何顯式指令或宣告來建立依賴性。App_Code資料夾中放置的類檔案可以包含任何可識別的ASP.NET元件  ——自定義控制元件、輔助類、build提供程式、業務類、自定義提供程式、HTTP處理程式等。

    注意        在開發時,對App_Code資料夾的更改會導致整個應用程式重新編譯。對於大型專案,這可能不受歡迎,而且很耗時。為此,鼓勵大家將程式碼進行模組化處理  到不同的類庫中,按邏輯上相關的類集合進行組織。應用程式專用的輔助類大多應當放置在App_Code資料夾中。

App_Code資料夾中存放的所有類檔案應當使用相同的語言。如果類檔案使用兩種或多種語言編寫,則必須建立特定語言的子目錄,以包含用每種語言編寫的類。一旦根據語言組織這些類檔案,就要在web.config檔案中為每個子目錄新增一個設定:

<compilation>

<codeSubDirectories>

<add  directoryName="VBFolder"  />

</codeSubDirectories>

</compilation>

重要的是,特定語言的子目錄應在web.config檔案中註冊,否則,不管它們屬於哪個資料夾,App_Code資料夾下  的所有檔案將被編譯成一個單獨的程式集。上述配置指令碼描述了這麼一種情況,即所有的C#檔案都放在App_Code資料夾的根目錄下,而把幾個  Visual  Basic  .NET類檔案移入VBFolder目錄中。如果<codeSubDirectories>節中提到的目錄不存在,則會收到一個編譯錯誤提  示。

App_Code根資料夾中的檔案被編譯成App_Code_xxx.dll程式集,其中xxx是隨機生成的字元序列。一個  給定子目錄中的檔案將被編譯成一個名為App_SubCode_xxx_yyy.dll的動態建立的程式集,其中xxx指示子目錄的名稱,而yyy是一個  隨機字元序列。只有在應用程式根目錄中的web.config檔案中進行了設定,<codeSubDirectories>節才有效。

在App_Code目錄或任何其他子目錄中放置一個assemblyinfo.cs檔案,可以建立一個強命名的程式集。顯然,如果該資料夾包含Visual  Basic  .NET檔案,那麼將使用assemblyinfo.vb檔案。程式集配置檔案可以引用一個.snk檔案來儲存強名稱的金鑰。

  注意        給一個程式集設定一個強名稱,首先必須獲得一個公開/私有金鑰對。通過使用強名稱(Strong  Name)工具(sn.exe),可以獲得這樣一個金鑰對。強名稱工具是我們可以在.NET  Framework的安裝路徑中發現的SDK  binary之一。金鑰對檔案通常有一個.snk副檔名。可以將該檔案儲存到一個應用程式資料夾中,並在assemblyinfo.cs檔案中引用它,如下所示:

            [assembly:  AssemblyKeyFileAttribute(@"yourKeyPair.snk")]

注意,Visual  Basic  .NET是在包含Visual  Studio  Solution的目錄中尋找金鑰檔案,而C#編譯器則在包含該binary的目錄中尋找金鑰檔案。據此可知,用此屬性調整我們使用的路徑,或者把金鑰檔案放在合適的資料夾中。

在隨後發生的任何重新生成中,程式集的名稱將發生變化。同時,老的AppDomain請求一結束,就刪除老的程式集。

App_Code資料夾並非只能包含類檔案。特別是,它可以包含並能自動地處理代表資料架構的XSD檔案。把一個XSD檔案  新增到該資料夾中時,編譯器將把它解析成一個有型別的DataSet類,並將它新增到應用程式作用域中。在ASP.NET  1.x中,這一工作由Visual  Studio  .NET嚮導,使用一個命令列實用程式(xsd.exe)完成的。

    注意        使用web.config檔案註冊一個元件(例如,一個自定義的伺服器控制元件或一個自定義的HTTP處理程式)時,通常要求指定包含該程式碼的程式集名稱。如  果該元件定義在App_Code資料夾中,則應該用什麼名稱來指示程式集?在這種情況下,只是忽略程式集資訊,並規定完整的類名即可。如果沒有規定任何程  序集,則ASP.NET執行庫將試圖從任何已裝載的程式集中裝入該類,包括為App_Code資料夾動態建立的程式集。

4.  App_Data資料夾

App_Data資料夾應該包含應用程式的本地資料儲存。它通常以檔案(諸如Microsoft  Access或Microsoft  SQL  Server  Express資料庫、XML檔案、文字檔案以及應用程式支援的任何其他檔案)形式包含資料儲存。該資料夾內容不由ASP.NET處理。該資料夾是ASP.NET提供程式儲存自身資料的預設位置。

  注意        預設ASP.NET帳戶被授予對資料夾的完全訪問許可權。如果碰巧要改變ASP.NET帳戶,一定要確保新帳戶被授予對該資料夾的讀/寫訪問權。

5.  App_GlobalResources資料夾

正如其他應用程式一樣,ASP.NET應用程式也可以使用資源,而且通常應該使用資源。資源是隔離應用程式使用者介面的可區域性  化部分的一種有效方法。一般而言,資源是與程式相關的不可執行的文字。典型的資源有影象、圖示、文字和附屬檔案,但是任何可序列化的物件也可以被看作資  源。應用程式資源儲存在應用程式的外部,這樣就能在不影響和重新編譯應用程式本身的情況下重新編譯和替換它們。

ASP.NET應用程式需要有一個主要程式集來儲存應用程式預設的或中性的資源。此外,還要部署許多附屬程式集,它們中各自  包含我們需要支援的某種文化的本地化資源。在ASP.NET  1.x中,編譯一個程式集內的資源有點麻煩。需要手動地將基於XML的資原始檔(那些帶.res副檔名的資源)編譯成.resources二進位制檔案。這  些檔案既可以嵌入到一個.NET可執行檔案中,也可以編譯成附屬程式集。使用資原始檔生成器實用程式resgen.exe,將文字和基於XML的資原始檔  轉變為.resource檔案。資原始檔名稱遵循baseName.cultureName.resource命名約定,其中baseName通常是應用  程式的名稱:

resgen.exe  ProAspNet20.resx  ProAspNet20.it.resources

建立.resource檔案以後,應當把它嵌入到一個程式集中,甚至可以作為一個資源容器來使用。要把一個資原始檔嵌入到一個附屬程式集中,可以使用程式集聯結器工具(al.exe)。在命令列上,指出程式集所使用的文化(如下面示例中的it,它代表義大利)和名稱。

al  /out:ProAspNet20.resources.dll  /c:it  /embed:ProAspNet20.it.resources

在編譯附屬程式集之後,它們將有相同的名稱。將它們部署到不同的子目錄中,分別按文化命名。

幸運的是,對於ASP.NET  2.0,附屬程式集的時代已經一去不復返了。更準確地說,附屬程式集仍然存在,但是由於App_GlobalResources保留資料夾,對開發人員來說它們已經成為過去的事情。

該資料夾中的任何定位的.resx檔案自動地被編譯成附屬程式  集。.resx檔案的名稱包含文化資訊,以幫助ASP.NET執行庫環境的程式集生成。如下檔案,resources.resx,  resources.it.resx,  resources.fr.resx,生成中性程式集以及適合於義大利(Italian)和法國(French)文化的附屬程式集。如果沒有要求特定文  化,則中性程式集是預設的文化資源。

App_GlobalResources資料夾中的資原始檔是應用程式的全域性資源,因而可以從任何頁面中引用它。和ASP.NET  1.x相比資源讀取結果也極大地簡化了:

<asp:Label  Runat="server"  Text="<%$  Resources:ResxFile,  MyResName  %>"  />

可以使用最新的稱為Resources的$-表示式以宣告的方式繫結全域性資源(第5章將詳細介紹$-表示式)。該表示式包括兩個引數:.resx資原始檔的名稱(沒有副檔名),以及要檢索的資源的名稱。以程式設計的方式訪問資源,請使用如下程式碼:

HttpContext.GetGlobalResourceObject(resxFile,  MyResName)

這兩個引數都是字串,並且與$-表示式中的引數具有相同的作用。此外,$-表示式Resources的實現在內部使用GetGlobalResourceObject。

6.  App_LocalResources資料夾

App_LocalResources資料夾位於包含一些ASP.NET頁面的資料夾下的一個子目錄。該資料夾可以使用位於  目錄結構中高一級目錄中的頁面命名的.resx檔案進行填充。假定父資料夾包含test.aspx,則可以在App_LocalResources資料夾  中找到一些可用的資原始檔如下:test.aspx.resx、test.aspx.it.resx和test.aspx.fr.resx。顯然,上述文  件中儲存的資源僅對test.aspx頁面有影響,因而只能在連結的頁面中看見它們(可以使用它們)。

如何訪問一個頁面特有的資源呢?對於程式設計訪問,可使用如下程式碼:

HttpContext.GetLocalResourceObject("/ProAspNet20/ResPage.aspx",

"PageResource1.Title")

第1個引數指出頁面虛擬路徑;第2個引數是資源名稱。對於宣告式訪問,使用meta:ResourceKey屬性。例如,

<asp:Button  Runat="server"  meta:resourcekey="ButtonResource1"  />

該宣告將一個惟一的資源鍵與特定按鈕例項關聯。區域性檔案.resx包含prefix.name形式的條目,其中prefix  是資源鍵,而name是繫結控制元件上的屬性名。為了賦予按鈕一個本地化標題(Text屬性),只要在資原始檔中建立一個  ButtonResource1.Text條目即可。

區域性和全域性資原始檔夾中存在的資原始檔都被編譯,以建立附屬程式集的類。最後的結果是開發人員建立.resx檔案,並測試該頁面。而ASP.NET編譯機制會完成其餘工作。

7.  App_Themes資料夾

App_Themes資料夾為ASP.NET控制元件定義主題。主題包含在App_Themes資料夾下的一個資料夾。根據定義,一個主題是一組帶有樣式資訊的檔案。主題資料夾中的檔案內容被編譯,以生成一個類,而該類被頁面呼叫以程式設計的方式設定主題化控制元件的樣式。

App_Themes資料夾列出應用程式的本地主題。  應用程式還可以繼承如下資料夾中定義的全域性主題:

%WINDOWS%/Microsoft.NET/Framework/[version]/ASP.NETClientFiles/Themes

從編譯的角度看,全域性主題和區域性主題沒有區別。如果一個給定名稱的主題,既存在應用程式的本地主題,又存在伺服器機器的全域性主題,則本地主題優先適用。

8.  App_WebReferences資料夾

在Visual  Studio  .NET  2003中,一個需要訪問Web服務的ASP.NET應用程式,將通過“新增Web引用”對話方塊獲得相應的.wsdl檔案。Web服務的WSDL(Web  Service  Description  Language)文件,對於從頁面使用Web服務是不夠的。ASP.NET頁面最終是一個託管類,並且需要與另一個託管類通訊。因此,Web服務被一個  代理類所包裝。該代理類是由Visual  Studio使用命令列工具wsdl.exe的服務建立的。該代理類儘量包含與Web服務商的Web方法一樣多的方法,並且它結合了Web服務的公共介面  定義的任何自定義的資料型別。

這個操作不需要開發人員付出很大的代價。然而,開發人員顯然要依賴於Visual  Studio來生成代理類。如果能夠直接把.wsdl檔案放在應用程式的目錄樹的某個地方,並讓ASP.NET處理其餘的任務,這樣不是更容易、更簡單  嗎?這正好是App_WebReferences資料夾要做的事情。

它識別那些用來描述所繫結的Web服務的.wsdl檔案,並生成執行時代理類,以便ASP.NET頁面能夠以型別安全的方式  放置對Web服務的呼叫。App_WebReferences資料夾可以包含子資料夾。子資料夾的名稱驅動最後所得到的代理類的名稱空間,而WSDL檔案  定義類名。例如,samples.wsdl檔案和ProsAspNet20子資料夾將建立一個稱為ProAspNet20.Samples的代理類。該動  態建立的程式集稱為App_WebReferences.xxx.dll,其中xxx是一個隨機的字元序列。

資料夾名稱
  檔案型別
  注        釋
 
Bin
  .dll
  包含應用程式所需的任何預生成的程式集
 
App_Browsers
  .browser
  包含應用程式特有的瀏覽器定義檔案,ASP.NET用它來識別各瀏覽器及確定它們的功能
 
App_Code
  .cs、.vb、.xsd、自定義的檔案型別
  包含作為應用程式的一部分編譯的類的原始檔。當頁面被請求時,ASP.NET編譯該資料夾中的程式碼。該資料夾中的程式碼在應用程式中自動地被引用
 
App_Data
  .mdb、.mdf、.xml
  包含Microsoft  Office  Access和SQL  Express檔案以及XML檔案或其他資料儲存
 
App_GlobalResources
  .resx
  包含在本地化應用程式中以程式設計方式使用的資原始檔
 
App_LocalResources
  .resx
  包含頁面範圍的資原始檔
 
App_Themes
  .skin、.CSS、.xsl、附屬檔案
  包含一組定義ASP.NET頁面和控制元件外觀的檔案
 
App_WebReferences
  .wsdl
  包含用以生成代理類的WSDL檔案,以及與在應用程式中使用Web服務有關的其他檔案