天天看點

ASP.NET保留檔案夾詳解[轉]

在一個ASP.NET應用程式中有許多保留檔案夾

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使用一個不同的擴充卡來生成該控件。

ASP.NET保留檔案夾詳解[轉]

< browsers >

ASP.NET保留檔案夾詳解[轉]

  < browser  id ="browserID" >

ASP.NET保留檔案夾詳解[轉]

   < controlAdapters >

ASP.NET保留檔案夾詳解[轉]

    < adapter  controlType ="Samples.CustomControl"

ASP.NET保留檔案夾詳解[轉]

    adapterType ="Samples.Adapters.CustomControlAdapter"   />

ASP.NET保留檔案夾詳解[轉]

   </ controlAdapters >

ASP.NET保留檔案夾詳解[轉]

  </ browser >

ASP.NET保留檔案夾詳解[轉]

</ browsers >

ASP.NET保留檔案夾詳解[轉]

假設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檔案中為每個子目錄添加一個設定:

ASP.NET保留檔案夾詳解[轉]

< compilation >

ASP.NET保留檔案夾詳解[轉]

  < codeSubDirectories >

ASP.NET保留檔案夾詳解[轉]

   < add  directoryName ="VBFolder"   />

ASP.NET保留檔案夾詳解[轉]

  </ codeSubDirectories >

ASP.NET保留檔案夾詳解[轉]

</ compilation >

ASP.NET保留檔案夾詳解[轉]

重要的是,特定語言的子目錄應在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.NET保留檔案夾詳解[轉]

< 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.NET保留檔案夾詳解[轉]

< 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服務有關的其他檔案

轉載于:https://www.cnblogs.com/lilixinshu/archive/2007/07/26/832460.html