ASP.NET 保留文件夾詳解
更新時(shí)間:2009年04月13日 11:23:23 作者:
在一個(gè)ASP.NET應(yīng)用程序中有許多保留文件夾
1. Bin文件夾
Bin文件夾包含應(yīng)用程序所需的,用于控件、組件或者需要引用的任何其他代碼的可部署程序集。該目錄中存在的任何.dll文 件將自動(dòng)地鏈接到應(yīng)用程序。如果在該文件夾中留有不用的或過期的文件,則可能出現(xiàn)“二義性引用(ambiguous reference)”異常的風(fēng)險(xiǎn)。換句話說,如果兩個(gè)不同的程序集定義相同的類(相同的命名空間和名稱),則ASP.NET運(yùn)行庫(kù)不能決定應(yīng)該使用哪一 個(gè)程序集,從而拋出一個(gè)異常。在開發(fā)時(shí),當(dāng)我們重新命名一個(gè)項(xiàng)目或一個(gè)程序集的名稱時(shí),這是常見的錯(cuò)誤。為了避免這種錯(cuò)誤,一定不要在該文件夾中保留任何 不必要的程序集,或者至少要從配置文件的<assemblies>節(jié)中刪除如下代碼行:
<add assembly="*" />
在表1.10所列的所有文件夾中,只有Bin可以被ASP.NET 1.x應(yīng)用程序識(shí)別。該文件夾是強(qiáng)制性的。
2. App_Browser文件夾
該可選的文件夾包含.browser文件。.browser文件描述瀏覽器(不管是移動(dòng)設(shè)備瀏覽器,還是臺(tái)式機(jī)瀏覽器)的特 征和功能。ASP.NET在安裝路徑下的Config\Browser文件夾中安裝了大量.browser文件,這些文件供所有應(yīng)用程序共享。我們只是把 當(dāng)前應(yīng)用程序特有的瀏覽器文件放在App_Browser文件夾下。.browser文件的內(nèi)容即時(shí)動(dòng)態(tài)地進(jìn)行編譯,以便向ASP.NET運(yùn)行庫(kù)提供最新 的瀏覽器信息。
讓我們簡(jiǎn)單談?wù)創(chuàng)碛幸粋€(gè)自定義的.browser文件可能有幫助的場(chǎng)景。設(shè)想應(yīng)用程序使用了一個(gè)在某個(gè)瀏覽器下不能有效呈現(xiàn)的控件。在指定的瀏覽器中顯示宿主頁(yè)面時(shí),可以編寫一個(gè).browser文件,迫使ASP.NET使用一個(gè)不同的適配器來生成該控件。
<browsers>
<browser id="browserID">
<controlAdapters>
<adapter controlType="Samples.CustomControl"
adapterType="Samples.Adapters.CustomControlAdapter" />
</controlAdapters>
</browser>
</browsers>
假設(shè)browserID與ASP.NET識(shí)別的標(biāo)準(zhǔn)瀏覽器之一相匹配,則上文所示的.browser文件指示在指定的瀏覽器下使用CustomControlAdapter呈現(xiàn)CustomControl。
3. App_Code文件夾
App_Code文件夾正好在Web應(yīng)用程序根目錄下,其存儲(chǔ)所有應(yīng)當(dāng)作為應(yīng)用程序的一部分動(dòng)態(tài)編譯的類文件。這些類文件自 動(dòng)鏈接到應(yīng)用程序,而不需要在頁(yè)面中添加任何顯式指令或聲明來創(chuàng)建依賴性。App_Code文件夾中放置的類文件可以包含任何可識(shí)別的ASP.NET組件 ——自定義控件、輔助類、build提供程序、業(yè)務(wù)類、自定義提供程序、HTTP處理程序等。
注意 在開發(fā)時(shí),對(duì)App_Code文件夾的更改會(huì)導(dǎo)致整個(gè)應(yīng)用程序重新編譯。對(duì)于大型項(xiàng)目,這可能不受歡迎,而且很耗時(shí)。為此,鼓勵(lì)大家將代碼進(jìn)行模塊化處理 到不同的類庫(kù)中,按邏輯上相關(guān)的類集合進(jìn)行組織。應(yīng)用程序?qū)S玫妮o助類大多應(yīng)當(dāng)放置在App_Code文件夾中。
App_Code文件夾中存放的所有類文件應(yīng)當(dāng)使用相同的語(yǔ)言。如果類文件使用兩種或多種語(yǔ)言編寫,則必須創(chuàng)建特定語(yǔ)言的子目錄,以包含用每種語(yǔ)言編寫的類。一旦根據(jù)語(yǔ)言組織這些類文件,就要在web.config文件中為每個(gè)子目錄添加一個(gè)設(shè)置:
<compilation>
<codeSubDirectories>
<add directoryName="VBFolder" />
</codeSubDirectories>
</compilation>
重要的是,特定語(yǔ)言的子目錄應(yīng)在web.config文件中注冊(cè),否則,不管它們屬于哪個(gè)文件夾,App_Code文件夾下 的所有文件將被編譯成一個(gè)單獨(dú)的程序集。上述配置腳本描述了這么一種情況,即所有的C#文件都放在App_Code文件夾的根目錄下,而把幾個(gè) Visual Basic .NET類文件移入VBFolder目錄中。如果<codeSubDirectories>節(jié)中提到的目錄不存在,則會(huì)收到一個(gè)編譯錯(cuò)誤提 示。
App_Code根文件夾中的文件被編譯成App_Code_xxx.dll程序集,其中xxx是隨機(jī)生成的字符序列。一個(gè) 給定子目錄中的文件將被編譯成一個(gè)名為App_SubCode_xxx_yyy.dll的動(dòng)態(tài)創(chuàng)建的程序集,其中xxx指示子目錄的名稱,而yyy是一個(gè) 隨機(jī)字符序列。只有在應(yīng)用程序根目錄中的web.config文件中進(jìn)行了設(shè)置,<codeSubDirectories>節(jié)才有效。
在App_Code目錄或任何其他子目錄中放置一個(gè)assemblyinfo.cs文件,可以創(chuàng)建一個(gè)強(qiáng)命名的程序集。顯然,如果該文件夾包含Visual Basic .NET文件,那么將使用assemblyinfo.vb文件。程序集配置文件可以引用一個(gè).snk文件來保存強(qiáng)名稱的密鑰。
注意 給一個(gè)程序集設(shè)置一個(gè)強(qiáng)名稱,首先必須獲得一個(gè)公開/私有密鑰對(duì)。通過使用強(qiáng)名稱(Strong Name)工具(sn.exe),可以獲得這樣一個(gè)密鑰對(duì)。強(qiáng)名稱工具是我們可以在.NET Framework的安裝路徑中發(fā)現(xiàn)的SDK binary之一。密鑰對(duì)文件通常有一個(gè).snk擴(kuò)展名??梢詫⒃撐募4娴揭粋€(gè)應(yīng)用程序文件夾中,并在assemblyinfo.cs文件中引用它,如下所示:
[assembly: AssemblyKeyFileAttribute(@"yourKeyPair.snk")]
注意,Visual Basic .NET是在包含Visual Studio Solution的目錄中尋找密鑰文件,而C#編譯器則在包含該binary的目錄中尋找密鑰文件。據(jù)此可知,用此屬性調(diào)整我們使用的路徑,或者把密鑰文件放在合適的文件夾中。
在隨后發(fā)生的任何重新生成中,程序集的名稱將發(fā)生變化。同時(shí),老的AppDomain請(qǐng)求一結(jié)束,就刪除老的程序集。
App_Code文件夾并非只能包含類文件。特別是,它可以包含并能自動(dòng)地處理代表數(shù)據(jù)架構(gòu)的XSD文件。把一個(gè)XSD文件 添加到該文件夾中時(shí),編譯器將把它解析成一個(gè)有類型的DataSet類,并將它添加到應(yīng)用程序作用域中。在ASP.NET 1.x中,這一工作由Visual Studio .NET向?qū)В褂靡粋€(gè)命令行實(shí)用程序(xsd.exe)完成的。
注意 使用web.config文件注冊(cè)一個(gè)組件(例如,一個(gè)自定義的服務(wù)器控件或一個(gè)自定義的HTTP處理程序)時(shí),通常要求指定包含該代碼的程序集名稱。如 果該組件定義在App_Code文件夾中,則應(yīng)該用什么名稱來指示程序集?在這種情況下,只是忽略程序集信息,并規(guī)定完整的類名即可。如果沒有規(guī)定任何程 序集,則ASP.NET運(yùn)行庫(kù)將試圖從任何已裝載的程序集中裝入該類,包括為App_Code文件夾動(dòng)態(tài)創(chuàng)建的程序集。
4. App_Data文件夾
App_Data文件夾應(yīng)該包含應(yīng)用程序的本地?cái)?shù)據(jù)存儲(chǔ)。它通常以文件(諸如Microsoft Access或Microsoft SQL Server Express數(shù)據(jù)庫(kù)、XML文件、文本文件以及應(yīng)用程序支持的任何其他文件)形式包含數(shù)據(jù)存儲(chǔ)。該文件夾內(nèi)容不由ASP.NET處理。該文件夾是ASP.NET提供程序存儲(chǔ)自身數(shù)據(jù)的默認(rèn)位置。
注意 默認(rèn)ASP.NET帳戶被授予對(duì)文件夾的完全訪問權(quán)限。如果碰巧要改變ASP.NET帳戶,一定要確保新帳戶被授予對(duì)該文件夾的讀/寫訪問權(quán)。
Bin文件夾包含應(yīng)用程序所需的,用于控件、組件或者需要引用的任何其他代碼的可部署程序集。該目錄中存在的任何.dll文 件將自動(dòng)地鏈接到應(yīng)用程序。如果在該文件夾中留有不用的或過期的文件,則可能出現(xiàn)“二義性引用(ambiguous reference)”異常的風(fēng)險(xiǎn)。換句話說,如果兩個(gè)不同的程序集定義相同的類(相同的命名空間和名稱),則ASP.NET運(yùn)行庫(kù)不能決定應(yīng)該使用哪一 個(gè)程序集,從而拋出一個(gè)異常。在開發(fā)時(shí),當(dāng)我們重新命名一個(gè)項(xiàng)目或一個(gè)程序集的名稱時(shí),這是常見的錯(cuò)誤。為了避免這種錯(cuò)誤,一定不要在該文件夾中保留任何 不必要的程序集,或者至少要從配置文件的<assemblies>節(jié)中刪除如下代碼行:
<add assembly="*" />
在表1.10所列的所有文件夾中,只有Bin可以被ASP.NET 1.x應(yīng)用程序識(shí)別。該文件夾是強(qiáng)制性的。
2. App_Browser文件夾
該可選的文件夾包含.browser文件。.browser文件描述瀏覽器(不管是移動(dòng)設(shè)備瀏覽器,還是臺(tái)式機(jī)瀏覽器)的特 征和功能。ASP.NET在安裝路徑下的Config\Browser文件夾中安裝了大量.browser文件,這些文件供所有應(yīng)用程序共享。我們只是把 當(dāng)前應(yīng)用程序特有的瀏覽器文件放在App_Browser文件夾下。.browser文件的內(nèi)容即時(shí)動(dòng)態(tài)地進(jìn)行編譯,以便向ASP.NET運(yùn)行庫(kù)提供最新 的瀏覽器信息。
讓我們簡(jiǎn)單談?wù)創(chuàng)碛幸粋€(gè)自定義的.browser文件可能有幫助的場(chǎng)景。設(shè)想應(yīng)用程序使用了一個(gè)在某個(gè)瀏覽器下不能有效呈現(xiàn)的控件。在指定的瀏覽器中顯示宿主頁(yè)面時(shí),可以編寫一個(gè).browser文件,迫使ASP.NET使用一個(gè)不同的適配器來生成該控件。
<browsers>
<browser id="browserID">
<controlAdapters>
<adapter controlType="Samples.CustomControl"
adapterType="Samples.Adapters.CustomControlAdapter" />
</controlAdapters>
</browser>
</browsers>
假設(shè)browserID與ASP.NET識(shí)別的標(biāo)準(zhǔn)瀏覽器之一相匹配,則上文所示的.browser文件指示在指定的瀏覽器下使用CustomControlAdapter呈現(xiàn)CustomControl。
3. App_Code文件夾
App_Code文件夾正好在Web應(yīng)用程序根目錄下,其存儲(chǔ)所有應(yīng)當(dāng)作為應(yīng)用程序的一部分動(dòng)態(tài)編譯的類文件。這些類文件自 動(dòng)鏈接到應(yīng)用程序,而不需要在頁(yè)面中添加任何顯式指令或聲明來創(chuàng)建依賴性。App_Code文件夾中放置的類文件可以包含任何可識(shí)別的ASP.NET組件 ——自定義控件、輔助類、build提供程序、業(yè)務(wù)類、自定義提供程序、HTTP處理程序等。
注意 在開發(fā)時(shí),對(duì)App_Code文件夾的更改會(huì)導(dǎo)致整個(gè)應(yīng)用程序重新編譯。對(duì)于大型項(xiàng)目,這可能不受歡迎,而且很耗時(shí)。為此,鼓勵(lì)大家將代碼進(jìn)行模塊化處理 到不同的類庫(kù)中,按邏輯上相關(guān)的類集合進(jìn)行組織。應(yīng)用程序?qū)S玫妮o助類大多應(yīng)當(dāng)放置在App_Code文件夾中。
App_Code文件夾中存放的所有類文件應(yīng)當(dāng)使用相同的語(yǔ)言。如果類文件使用兩種或多種語(yǔ)言編寫,則必須創(chuàng)建特定語(yǔ)言的子目錄,以包含用每種語(yǔ)言編寫的類。一旦根據(jù)語(yǔ)言組織這些類文件,就要在web.config文件中為每個(gè)子目錄添加一個(gè)設(shè)置:
<compilation>
<codeSubDirectories>
<add directoryName="VBFolder" />
</codeSubDirectories>
</compilation>
重要的是,特定語(yǔ)言的子目錄應(yīng)在web.config文件中注冊(cè),否則,不管它們屬于哪個(gè)文件夾,App_Code文件夾下 的所有文件將被編譯成一個(gè)單獨(dú)的程序集。上述配置腳本描述了這么一種情況,即所有的C#文件都放在App_Code文件夾的根目錄下,而把幾個(gè) Visual Basic .NET類文件移入VBFolder目錄中。如果<codeSubDirectories>節(jié)中提到的目錄不存在,則會(huì)收到一個(gè)編譯錯(cuò)誤提 示。
App_Code根文件夾中的文件被編譯成App_Code_xxx.dll程序集,其中xxx是隨機(jī)生成的字符序列。一個(gè) 給定子目錄中的文件將被編譯成一個(gè)名為App_SubCode_xxx_yyy.dll的動(dòng)態(tài)創(chuàng)建的程序集,其中xxx指示子目錄的名稱,而yyy是一個(gè) 隨機(jī)字符序列。只有在應(yīng)用程序根目錄中的web.config文件中進(jìn)行了設(shè)置,<codeSubDirectories>節(jié)才有效。
在App_Code目錄或任何其他子目錄中放置一個(gè)assemblyinfo.cs文件,可以創(chuàng)建一個(gè)強(qiáng)命名的程序集。顯然,如果該文件夾包含Visual Basic .NET文件,那么將使用assemblyinfo.vb文件。程序集配置文件可以引用一個(gè).snk文件來保存強(qiáng)名稱的密鑰。
注意 給一個(gè)程序集設(shè)置一個(gè)強(qiáng)名稱,首先必須獲得一個(gè)公開/私有密鑰對(duì)。通過使用強(qiáng)名稱(Strong Name)工具(sn.exe),可以獲得這樣一個(gè)密鑰對(duì)。強(qiáng)名稱工具是我們可以在.NET Framework的安裝路徑中發(fā)現(xiàn)的SDK binary之一。密鑰對(duì)文件通常有一個(gè).snk擴(kuò)展名??梢詫⒃撐募4娴揭粋€(gè)應(yīng)用程序文件夾中,并在assemblyinfo.cs文件中引用它,如下所示:
[assembly: AssemblyKeyFileAttribute(@"yourKeyPair.snk")]
注意,Visual Basic .NET是在包含Visual Studio Solution的目錄中尋找密鑰文件,而C#編譯器則在包含該binary的目錄中尋找密鑰文件。據(jù)此可知,用此屬性調(diào)整我們使用的路徑,或者把密鑰文件放在合適的文件夾中。
在隨后發(fā)生的任何重新生成中,程序集的名稱將發(fā)生變化。同時(shí),老的AppDomain請(qǐng)求一結(jié)束,就刪除老的程序集。
App_Code文件夾并非只能包含類文件。特別是,它可以包含并能自動(dòng)地處理代表數(shù)據(jù)架構(gòu)的XSD文件。把一個(gè)XSD文件 添加到該文件夾中時(shí),編譯器將把它解析成一個(gè)有類型的DataSet類,并將它添加到應(yīng)用程序作用域中。在ASP.NET 1.x中,這一工作由Visual Studio .NET向?qū)В褂靡粋€(gè)命令行實(shí)用程序(xsd.exe)完成的。
注意 使用web.config文件注冊(cè)一個(gè)組件(例如,一個(gè)自定義的服務(wù)器控件或一個(gè)自定義的HTTP處理程序)時(shí),通常要求指定包含該代碼的程序集名稱。如 果該組件定義在App_Code文件夾中,則應(yīng)該用什么名稱來指示程序集?在這種情況下,只是忽略程序集信息,并規(guī)定完整的類名即可。如果沒有規(guī)定任何程 序集,則ASP.NET運(yùn)行庫(kù)將試圖從任何已裝載的程序集中裝入該類,包括為App_Code文件夾動(dòng)態(tài)創(chuàng)建的程序集。
4. App_Data文件夾
App_Data文件夾應(yīng)該包含應(yīng)用程序的本地?cái)?shù)據(jù)存儲(chǔ)。它通常以文件(諸如Microsoft Access或Microsoft SQL Server Express數(shù)據(jù)庫(kù)、XML文件、文本文件以及應(yīng)用程序支持的任何其他文件)形式包含數(shù)據(jù)存儲(chǔ)。該文件夾內(nèi)容不由ASP.NET處理。該文件夾是ASP.NET提供程序存儲(chǔ)自身數(shù)據(jù)的默認(rèn)位置。
注意 默認(rèn)ASP.NET帳戶被授予對(duì)文件夾的完全訪問權(quán)限。如果碰巧要改變ASP.NET帳戶,一定要確保新帳戶被授予對(duì)該文件夾的讀/寫訪問權(quán)。
相關(guān)文章
ASP.NET Core中使用令牌桶限流的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET Core中使用令牌桶限流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
linq to sql 中,如何解決多條件查詢問題,答案,用表達(dá)式樹! (下)
在上一篇中,我們做了基于linq to sql 的多條件組合查詢,但通過監(jiān)視數(shù)據(jù)庫(kù)發(fā)現(xiàn),這樣做的成本比較高,每次都要取出全部的數(shù)據(jù)到內(nèi)存進(jìn)行篩選.2011-08-08
服務(wù)器安全狗導(dǎo)致ASP.NET網(wǎng)站運(yùn)行出錯(cuò)的一個(gè)案例
這篇文章主要介紹了服務(wù)器安全狗導(dǎo)致ASP.NET網(wǎng)站運(yùn)行出錯(cuò)的一個(gè)案例,最后一并給出了解決方法,需要的朋友可以參考下2014-08-08
MVC實(shí)現(xiàn)下拉框聯(lián)動(dòng)效果(單選)
這篇文章主要為大家詳細(xì)介紹了MVC實(shí)現(xiàn)下拉框聯(lián)動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
ASP.NET防止頁(yè)面刷新的兩種解決方法小結(jié)
本篇文章主要是對(duì)ASP.NET防止頁(yè)面刷新的兩種解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
asp.net 通過指定IP地址得到當(dāng)前的網(wǎng)絡(luò)上的主機(jī)的域名
通過指定的ip地址獲取當(dāng)前網(wǎng)絡(luò)的主機(jī)的域名,大家可以看看2009-02-02

