原文:http://docs.asp.net/en/latest/conceptual-overview/understanding-aspnet5-apps.html
英文捉急,花了挺多時間的,希望看到的同學能有所收獲,有錯誤的地方請指正。
對于理解如何快速構建 web apps ,ASP.NET 5 引入了一些非常重要的新基本概念。這些概念在 web 編程中不是最新的,但往往對習慣使用 ASP.NET 和 Visual Studio 的開發者來說可能比較陌生。
In this article:
- ASP.NET PRoject Structure
- Framework Target
- The project.json File
- The global.json File
- The wwwroot folder
- Client Side Dependency Management
- Server Side Dependency Management
- Configuring the application
- Application Startup
ASP.NET 5 的項目架構新增了新的概念并且替代了老版本 ASP.NET 項目包含的元素。新的默認 web 項目模板創建了一個解決方案并且項目架構如下:

第一個你可能注意到的是這個新框架有一個包含 global.json 的 Solution Items 文件夾,并且web項目本身的路徑在解決方案的 src 文件夾中。新架構也包含了一個特殊的 wwwroot 文件夾,和一個 Dependencies(依賴)塊用于引用的內容,就像以往ASP.NET項目的 References(引用)一樣。根目錄中項目有一些新文件如 bower.json,config.json,gruntfile.js,package.json,project.json 和 startup.cs。你可能注意到 global.asax,package.config 和 web.config 不見了。在以往 ASP.NET 版本中,很多程序配置會放在這些文件中。在 ASP.NET 5 中,這些信息與邏輯被重構到更小、職責更專一的文件中。
ASP.NET 5 可以指定多個 framework,允許應用程序被發布到不同的 hosting 環境中。默認情況下程序會指定完整版本的 .NET,但是也可以指定 .NET Core。大部分遷移的程序會指定全功能的ASP.NET 5框架,至少一開始是這樣,是由于它們可能很多依賴包含在今天 .NET Core 還沒有這些功能的在基礎類庫中。.NET Core 是 .NET framework 的小版本,優化了web程序并且支持Linus和Mac環境。它可以部署在程序中,允許一個server中不同程序指定不同版本的.NET Core。它也是模塊化的,允許按需功能附加,如單獨的NuGet包。 (learn more about .NET Core).
通過在在 Solution Explorer 中右擊 web 項目并選擇 Properties,你能看到哪個框架目前被指定到web程序項目的屬性中:

默認情況下,Use specific DNX version的勾選框是不選的。指定一個特定版本,點勾選框并選擇對應版本、平臺和架構。
project.json 文件 ASP.NET 5 的新東西。它被用于定義項目的服務端依賴(server side dependencies,下面會討論),還有其他一些項目特定信息。project.json的默認內容模板如下:

webroot 這一節指定了執行網站的文件夾,按照約定默認是 wwwroot 文件夾(the wwwroot folder)。Version屬性指定了項目當前的版本。你可以定義其他關于項目的元數據,如authors、description。
ASP.NET 5對命令行有非常好的支持,并且commands節允許配置確定的命令行指令(例如,啟動web site或run tests)
"commands": { "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000", "gen": "Microsoft.Framework.CodeGeneration", "ef": "EntityFramework.Commands"},frameworks 這一節指定了哪個framework會被build,哪些依賴需要被包含。例如,如果你用LINQ和集合,你可以通過把它們增加到 dnxcore50 列表依賴來確定時候包含在了你的.NET Core build中,如下所示。
延伸閱讀:Diagnosing dependency issues with ASP.NET 5
exclude 節被用于識別應該在包含在 build 中的文件和文件夾。同樣,bundleExclude 被用于識別 bunding 時應該包含 到網站中的內容(例如,在生產環境中)。

scripts 節被用于指定對于特定 build 的自動化腳本。Visual Studio 現在內置支持在特定事件之前或之后運行這些腳本。默認的 ASP.NET 項目模板已經包含在運行 postrestore 和 prepare 時通過 npm 和 bower 安裝 client side dependencies。

global.json 文件被用于配置整個解決方案。它默認只包含2節,sources 和 sdk。
{ "projects": [ "src", "test" ], "sdk": { "version": "1.0.0-beta5-11584" }}source 屬性指定了解決方案中包含源碼的文件夾。默認情況下項目架構把文件放在 src 文件夾中,允許在同級目錄中構建工件,更簡便地從源碼控制中排除。

在先前的 ASP.NET 版本中,項目的根目錄通常就是網站根目錄。如果你把一個 Default.aspx 文件放在一個早期版本的 ASP.NET 中,如果有對 web 程序根目錄的請求時就會加載。在之后的 ASP.NET 版本中,增加了路由的支持,解耦了文件路徑和對應的URL(因此,Controllers 文件夾中的 HomeController 可以使用默認實現的路由處理根目錄的服務請求)。不管如何,路由只能用于特定的程序邏輯,客戶端展示頁面時無需靜態文件支持。圖片、腳本文件、樣式等資源仍然普遍基于程序的文件架構加載,而非項目根目錄。

基于文件的方式存在一些問題。首先,保護敏感項目文件需要框架級的文件名與擴展名保護,以阻止 web.config 或 global.asax 之類的東西被客戶端請求。特別地阻止特定文件的訪問(也稱為黑名單)遠遠沒有賦予權限去訪問文件安全(也成為白名單)。通常對于 dev/test 和 production 也有不同版本的權限 (例如 web.config)。開發中,腳本通常會單獨分離并且放在可讀格式中,但是在生產部署中會最小化并且綁定在一起。對只部署生產文件到生產環境有利,但是在前期架構中處理這類的情況卻非常棘手。
進入 ASP.NET 5 的 wwwroot 文件夾。wwworrt 文件夾代表了實際 web 程序在 web server 中運行的根目錄。靜態文件,如 config.json,不放在 wwwroot 中的話永遠是無法訪問的,而且沒必要再創建阻止訪問敏感文件的規則了。對比黑名單阻止訪問敏感文件,在 web 請求中只能訪問 wwwroot 的白名單更加安全。
還有個好處是,wwwroot 文件夾還簡化了通用的任務如 bundling(捆綁) 和minification(最小化),使得現在能更加簡便的合成到一個標準 build process 和自動化工具如 Grunt。
Dependencies 文件夾包含了2個子目錄:Bower 和 NPM。這些文件夾關聯到2個同名的包管理器,并且它們被用于獲取客戶端依賴和工具(例如 jQuery、bootstrap 或 grunt)。展開文件夾后能看到目前被工具管理著的依賴與當前被項目使用的版本。

bower 依賴被 bower.json 文件控制。你會注意到上圖的每個 items 列表關聯到 bower.json,如下:

bower.json 文件中,每個依賴被進一步地配置在它們本身的節當中,指明了當 bower 任務執行時將如何向 wwwroot 文件夾部署。
默認地,bower 任務使用 gulp 執行,gulp 被配置在 gulpfile.js 中。目前 web 模板的 gulpfile,包含了從 bower 文件夾復制 copying 和 cleaning 腳本與 CSS 文件到 wwwroot 中的 /lib 文件夾的任務。

References 文件夾列出了項目的服務端的引用細節。ASP.NET 開發者應該對它比較熟悉,但它已經被修改成區分了不同架構目標(framework target)的不同引用,如全功能的 ASP.NET 5.0 與 ASP.NET Core 5.0。在每個架構目標中,你會找到分離的引用,它們的圖標指明了引用究竟是一個 assembly,一個 NuGet package,還是一個項目。要注意的是這些依賴會在編譯時被檢查,缺失的依賴會從配置的 NuGet package 源下載(特指配置:Options - NuGet Package Manager - Package Sources)。

ASP.NET 5 不再存放配置在 xml 文件中(web.config 和 machine.config)。配置現在被放在 config.json中,它特別被設計為存放 app configuration settings。默認的 ASP.NET 項目模板在 config.json 文件中包含 Entity Framework 和特定的 database connection string 細節。

config.json 中的單獨條目不局限于 name-value pairs的形式,可以指定 rich objects。條目還可以引用其他條目,你能看到 EF 是如何配置的,如上圖。
config.json 文件名沒啥特別的 - 它被 Startup.cs 中的名稱指定了。你能添加許許多多對你的程序有用的配置文件,好過放在過于龐大的 web.config 文件中。你還能不局限于使用 JSON 格式文件 - 你愿意的話,仍可以使用 XML 甚至 .INI 文件。
訪問配置數據最好的方式是注入 IConfiguration <https://github.com/aspnet/Configuration/blob/dev/src/Microsoft.Framework.ConfigurationModel.Interfaces/IConfiguration.cs>``_ interface into your controller, and then simply calling its ``Get 方法,使用你需要的配置元素名稱。例如,在配置中存儲程序名稱并且把它顯示到 About 頁面中,你會需要在默認項目中作3個改變。首先,在 project.config 中增加入口。

其次,確保 ASP.NET 知道當一個構造器需要 IConfiguration 實例時會得到什么。這種情況,我們可以指定配置值為單例,因為我們不希望它在程序生命周期中變化。某一刻我們會處理 Startup.cs,但在這一步,僅僅在 Startup.cs 中 ConfigureServices() 方法結尾中增加1行:
services.AddSingleton(_ => Configuration);最后一步也是第三步是指定一個 IConfiguration 實例,你的 controller 會通過構造器使用它。在類中遵循按照 Explicit Dependencies Principle 是一個很好的習慣,并且使 ASP.NET 5 內置的依賴注入能正常工作。分配實例給本地字段,然后通過調用 Get 實例方法訪問配置值。
你會需要確保這個 using 聲明:
using Microsoft.Framework.ConfigurationModel;然后,更新 controller,如下:

運行程序并導航到 About 頁面,你會看到結果。

ASP.NET 5 已經把功能集分離到多種模塊中,這些模塊可以單獨增加到一個 web 程序中。這允許不導入沒用的功能,以達到精簡 we
新聞熱點
疑難解答