ASP.NET 網站中的共用程式碼資料夾

Visual Studio 2010

更新:2007 年 11 月

如果 Web 應用程式包括要在網頁之間共用的程式碼,可以將此程式碼保存在 Web 應用程式根目錄之下的兩個特殊資料夾︰Bin 資料夾和 App_Code 資料夾。當您建立這些資料夾並在其中存放特定的檔案類型時,ASP.NET 便會以特殊的方式處理檔案。

您可以將已編譯的組件存放在 Bin 資料夾中,Web 應用程式中的任何其他程式碼 (例如網頁的程式碼) 都會自動參考它。典型的範例,例如您有自訂類別的已編譯程式碼。可以將已編譯的組件複製到 Web 應用程式的 Bin 資料夾,然後所有頁面就都可使用此類別。

在 Bin 資料夾中的組件不需要註冊。.dll 檔案只要出現在 Bin 資料夾中,ASP.NET 就能夠辨識它。如果變更 .dll 並將新版本寫入至 Bin 資料夾,ASP.NET 會偵測更新並將新版本的 .dll 使用於隨後要求的新網頁。

Bin 資料夾的安全性

將已編譯的組件放置到 Bin 資料夾可能會有安全性風險。如果您自己撰寫程式碼並編譯它,就會知道程式碼執行什麼工作。但是,您必須將 Bin 資料夾中已編譯的程式碼視為任何可執行的程式碼。請謹慎對待已編譯的程式碼,除非您已對它做過測試,並完全確定瞭解它執行什麼工作。

請注意這些將已編譯的程式碼放到 Bin 資料夾的安全性考量︰

  • 在 Bin 資料夾中的組件的範圍是目前的應用程式。因此,它們無法存取資源或叫用目前 Web 應用程式以外的程式碼。

  • 在執行階段,組件的存取層級是由本機電腦上指定的信任層級來建立。如需詳細資訊,請參閱 ASP.NET 信任層級和原則檔

  • 如果您是在例如 Visual Studio 之類的設計工具中工作,在 Bin 資料夾中的程式碼會以和執行階段不同的內容執行。例如,程式碼可能在完全信任下執行。

可以將原始程式碼儲存在 App_Code 資料夾,它會自動在執行階段編譯。產生的組件可由 Web 應用程式中的任何其他程式碼存取。因此,App_Code 資料夾的工作很像 Bin 資料夾,差別在於是在此資料夾存放原始程式碼而不是已編譯的程式碼。由於 App_Code 資料夾和其在 ASP.NET Web 應用程式中的特殊狀態,讓 App_Code 資料夾可以建立自訂類別和其他只有原始程式碼的檔案,並在 Web 應用程式中使用而不必獨立進行編譯。

App_Code 資料夾可以包含撰寫為傳統類別檔案的原始程式碼檔案,也就是具有 .vb 副檔名、.cs 副檔名等等的檔案。但也可以包含未明確在指定程式語言的檔案。範例包括 .wsdl (Web 服務描述語言) 檔案和 XML 結構描述 (.xsd) 檔案。ASP.NET 可以將這些檔案編譯到組件中。

App_Code 資料夾可以包括所有您需要的檔案和子資料夾。可以使用任何覺得方便的方法來組織原始程式碼,ASP.NET 仍會將所有程式碼編譯成為可由 Web 應用程式中之所有其他程式碼存取的單一組件。

t990ks23.alert_note(zh-tw,VS.100).gif注意事項:

App_Code 資料夾中不允許有使用者控制項,包括單一檔案使用者控制項,以及使用程式碼後置 (Code-Behind) 模式的使用者控制項。將使用者控制項放到 App_Code 目錄會造成使用者控制項的程式碼不按其必要的順序編譯,因此不允許如此操作。請注意,使用者控制項已可以在應用程式的任何位置中供網頁使用,所以不需要在 App_Code 資料夾中。

推斷 App_Code 資料夾的程式語言

App_Code 資料夾並未明確標示為包含使用任一程式語言撰寫的檔案,而是由 ASP.NET 根據 App_Code 資料夾包含的檔案,推斷要叫用哪一個編譯器。如果 App_Code 資料夾包含 .vb 檔案,ASP.NET 會使用 Visual Basic 編譯器;如果包含 .cs 檔案,ASP.NET 則會使用 C# 編譯器,依此類推。

如果 App_Code 資料夾只包含程式設計語言模稜兩可的檔案,例如 .wsdl 檔案,則 ASP.NET 會使用 Web 應用程式的預設編譯器 (此編譯器是由 Web 應用程式或電腦組態檔的 compilation 所建立)。

App_Code 資料夾中的多種程式語言

因為 App_Code 資料夾中的原始程式碼編譯為單一組件,在 App_Code 資料夾中的所有檔案必須使用相同的程式語言。例如,App_Code 資料夾不可以同時包含 Visual Basic 和 C# 的原始程式碼。

但是,您可以設定 Web 應用程式將 App_Code 資料夾的子資料夾視為個別可編譯單元。然後每一個資料夾就可以包含不同程式語言的原始程式碼。組態的指定方式是在 Web.config 檔案的 compilation 項目中,建立 codeSubDirectories 項目並加入子資料夾的參考。下列範例說明如何設定名稱為 VBCode 和 CSCode 的子資料夾,以編譯個別的組件︰

<compilation debug="false">
    <codeSubDirectories>
        <add directoryName="VBCode" />
        <add directoryName="CSCode" />
    </codeSubDirectories>
</compilation>

VBCode 和 CSCode 子資料夾的參考並不需要包含任何有關子資料夾中所包含的程式語言為何之資訊。如同 App_Code 資料夾本身,ASP.NET 是根據子資料夾中的檔案來推斷要使用的編譯器。

App_Code 資料夾的安全性

App_Code 資料夾中程式碼的安全性問題,基本上和 Bin 資料夾中的程式碼安全性問題一樣,程式碼是在執行階段編譯成組件。比較好的一點是您可以閱讀 App_Code 資料夾中檔案的原始程式碼。但是,如果您不是完全瞭解該程式碼,仍可能有安全性風險。因此,請用對待來自原始程式碼之已編譯程式碼一樣的態度,來對待在 App_Code 資料夾中的原始程式碼。

顯示: