本文參考自:http://www.codeproject.com/Articles/1104668/Introducing-ASP-NET-Core-The-New-ASP-NET-in-Townhtml
轉載請註明出處:葡萄城官網,葡萄城爲開發者提供專業的開發工具、解決方案和服務,賦能開發者。前端
背景git
最新版本的 ASP.NET 叫作 ASP.NET Core (也被稱爲 ASP.NET 5) 它顛覆了過去的 ASP.NET。github
ASP.NET Core 1.0 是一個開源跨平臺的開發框架,用於構建基於雲的現代 Web 應用 。它是從底層開始從新構建來提供性能優良的Web應用開發框架,能夠部署在雲上或者本地服務器上。另外,它使得 ASP.NET 應用更加精簡和模塊化(能夠根據你的應用須要向裏面添加其餘模塊),跨平臺(你能夠很容易的在 Windows, Mac or Linux 上開發和部署你的應用),雲優化(你能夠在雲上在雲上部署和調試你的應用)。web
對於使用 ASP.NET 舊版本的咱們來講,這意味着什麼?編程
若是你正在使用舊版本的 ASP.NET 或者你有 WebForms 的開發背景,那麼你將會認識到 ASP.NET Core 有多完美,這感受起來就像從古典的 ASP 時代來到全新的 ASP.NET 的世界。json
下面列出 ASP.NET Core 1.0 的核心變化.windows
你能夠在 OSX 和 Linux上運行 ASP.NET Core 應用,這對於 ASP.NET 來講,這具備跨時代的意義,也給 ASP.NET 開發者和設計師們帶來了全新的體驗。ASP.NET Core 具備兩個運行時,這意味着你能夠選擇不一樣的運行環境來部署你的應用,使得你的應用將更加靈活。瀏覽器
ASP.NET Core 1.0 是一個 ASP.NET 的重構版本,它運行於最新的 .NET Core。它是模塊化的,容許開發者以插件的形式添加應用所須要的模塊,大多數的功能都將做爲插件提供並經過 NuGet 程序包管理。這樣作的一個好處就是你能夠升級應用的一個模塊,但絲絕不會影響其餘模塊;另外,.NET Core 是一個跨平臺的運行時,所以你能夠在 OSX 或 Linux 操做系統上部署你的應用;它也是一個雲優化的運行時,用於在雲上部署和調試應用;.NET Core 能夠和你的應用程序一塊兒被部署,當服務器上有多個 .NET Core 版本時, 你依舊能夠運行 ASP.NET Core 應用。前端框架
你也能夠建立只運行在 windows 下完整 .NET 框架的 ASP.NET Core 應用。
ASP.NET 4.6 是最新的完整 .NET Framework 的發佈版本,它容許你能夠利用全部的 .NET 組件而且具有向後兼容能力。若是你計劃將應用遷移到 .NET core,那麼你須要作適量的修改,由於 .NET Core 相對於完整 .NET Framework 來講有所限制。
須要明確的是,ASP.NET 4.6 更加成熟。它現在久經考驗而且現已發佈並可以使用。ASP.NET Core 1.0 是1.0 發佈版本,包含 Web API 和 MVC,可是如今尚未 SignalR 和 Web Pages。,它也不支持VB 和 F# 語言。
ASP.NET Core 的跨平臺,讓它再也不只依賴 Visual Studio,開發者和設計師們能夠在本身喜歡的環境上工做。好比 Sublime Text,WebStorm ,這真是太棒了!
若是你使用 Visual Studio 建立了一個空的 ASP.NET Core 工程,那麼你將會看到下面的驚喜。(除非你沒有使用以前的 ASP.NET 建立過任何項目)
你感受到驚喜了嗎?新的工程結構徹底不同了, 工程模板面目一新,包含如下的新文件:
· global.json: 你能夠在這裏放置解決方案的配置信息和工程之間的引用。
· Program.cs: 這個文件包含了 ASP.NET Core RC2 應用的 Main 方法,負責配置和啓動應用程序。
· src folder: 包含組成你應用程序的所有項目代碼。
· wwwroot: 你的靜態文件將被放置在這個文件夾,它們都將做爲資源直接提供給客戶端,包含 HTML,CSS 和 JavaScript 文件。
· project.json: 包含項目設置。在 ASP.NET Core中,你能夠經過使用 NuGet 程序包管理工具(NPM)添加 NuGet 包或者編輯這個文件來管理從屬。你能夠經過任何文本編輯器來編輯這個文件,若是你使用 Visual Studio 2015,,這將會更加 輕鬆,由於它的智能提示會幫助你找到合適的 NuGet 包做爲從屬。project.json 就像下面這樣。
· startup.cs 這個主要放置你 ASP.NET Core 的 stratup 和 configuration 代碼,下面就是 stratup 類的樣子。
ConfigureServices 方法定義了你應用程序使用的服務,Configure 方法用來定義組成請求管道的中間件。
· References: 它包含了 .NETCoreApp 第一個版本運行時的引用。
是的,WebForms 再也不是 ASP.NET 5 的一部分,這真使人悲傷。你能夠繼續使用 VS2015 的 .NET 4.6 來構建 Web Forms 應用,可是卻不能體會 ASP.NET 5 的新特性了。
我已經開發了不少年從小型到大型的企業級 Web Forms 應用。 我很喜歡 Web Forms,,事實上我還會繼續支持在各類論壇使用 WebForms 的社區,好比 http://forums.asp.net。可是咱們是時候進步了,去學習一些新東西。這是學習 ASP.NET MVC 最後的時間了,就像過去的許多事物,你要麼去適應,要麼被淘汰。
除了 WebForms, the .NET Core 也沒有包含 Windows Forms, WCF, WPF, Silverlight 等等。
目前,在當前 ASP.NET Core 1.0 RC2 版本中, VB.NET 和 F# 也不被支持。
ASP.NET Core 將見證 MVC, Web API 和 Web Pages(可能包含)組合在一個架構中,它被稱爲 ASP.NET MVC Core。儘管當前發佈版本中,還不支持 Web Pages and SignalR。
在以前的 ASP.NET MVC 中, MVC 控制器和 Web API 控制器是不一樣的。 一個 MVC 控制器使用基類 System.Web.MVC.Controller ,一個 Web API 控制器使用基類 System.Web.Http.ApiController 。 在 MVC Core 中,會爲它們提供一個共同的基類,就是 Microsoft.AspNetCore.Mvc.Controller 。
對於 HTML Helpers 來講,MVC 和 Web Pages 的合併是很是有可能的。 Web Pages 編程模型對當前版原本說還不適用,因此咱們還不能負責任地說下一步計劃合併哪些特性。 可是咱們能夠預測到,傳統的 MVC 模型綁定將會出現。
在以前 ASP.NET MVC 中,, Html.Action() 幫助方法通常用於調用一個 sub-controller。ASP.NET MVC Core 將會使用新的 View Components 用來代替使用Html.Action() 的部件。
View Components 支持徹底異步,這容許你建立異步的視圖組件。
下面是一個簡單的視圖組件的例子,根據身份會返回我的介紹。
using Microsoft.AspNetCore.Mvc; using MVC6Demo.Models; using System.Threading.Tasks; using System.Collections.Generic; namespace MVC6Demo.ViewComponents { public class PersonListViewComponent : ViewComponent { public async Task<iviewcomponentresult> InvokeAsync(string status) { string viewToUse = "Default"; bool isFiltered = false; PersonModel model = new PersonModel(); if (status.ToLower().Equals("registered")) { viewToUse = "Registered"; isFiltered = true; } var p = await GetPersonAsync(status, isFiltered); return View(viewToUse,p); } private Task<ienumerable<person>> GetPersonAsync(string status, bool isFiltered) { return Task.FromResult(GetPerson(status,isFiltered)); } private IEnumerable<person> GetPerson(string status, bool isFiltered) { PersonModel model = new PersonModel(); if (isFiltered) return model.GetPersonsByStatus(status); else return model.GetAll; } } } </person>
下面是 View Component 的視圖:
<h3>Person List</h3> <ul> @foreach (var p in Model) { <li>@string.Format("{0} {1}",p.FirstName,p.LastName)</li> } </ul>
這裏展現瞭如何在主視圖中調用 View Components
<div> @await Component.InvokeAsync("PersonList", new { type = "Registered" }) </div>
ASP.NET MVC Core 提供了少許新指令。 下面咱們來看看如何使用 @inject。 @inject 指令容許你注入一個類中的方法到你的視圖中。
這是一個簡單的類,來展現一些異步的方法。
using System.Threading.Tasks; using System.Linq; namespace MVC6Demo.Models { public class Stats { private PersonModel _persons = new PersonModel(); public async Task<int> GetPersonCount() { return await Task.FromResult(_persons.GetAll.Count()); } public async Task<int> GetRegisteredPersonCount() { return await Task.FromResult( _persons.GetAll.Where(o => o.Status.ToLower().Equals("registered")).Count()); } public async Task<int> GetUnRegisteredPersonCount() { return await Task.FromResult( _persons.GetAll.Where(o => o.Status.ToLower().Equals("")).Count()); } } }
如今咱們就能夠在視圖中使用 @inject 指令來調用那些方法:
@inject MVC6Demo.Models.Stats Stats
@{
ViewBag.Title = "Stats";
}
<div>
這是否是很酷?
查看我關於 ASP.NET MVC 新指令詳細例子的文章: Getting Started with ASP.NET MVC Core
ASP.NET MVC Core 另一個很是酷的東西就是 Tag Helpers。對於以前的 HTML Helpers,Tag Helpers 是可選的替代語法。
因此相比於如下代碼:
@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <h4>Use a local account to log in.</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" }) </div> </div> }
你可使用這些代碼:
<form asp-controller="Account" asp-action="Login" method="post" class="form-horizontal" role="form"> <h4>Use a local account to log in.</h4> <hr /> <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="UserName" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="UserName" class="col-md-2 control-label" /> <span asp-validation-for="UserName" class="text-danger"></span> </div> </div> </form>
14年前,ASP.NET 平臺基本只能部署在一種服務器上,那就是 IIS。幾年以後,Visual Studio Development Web Server(也叫做「Cassini」)做爲一種開發服務被使用,可是它們最終都是調用 System.Web 做爲應用程序和 Web 服務器中間的主機層。System.Web 主機與 IIS 耦合度很高,因此要想運行在另外一臺主機上會很是困難。
後來 OWIN 做爲應用程序和 Web 服務器中間的接口出現。 Microsoft 開發了 Katana 做爲一個 OWIN 的實現,能夠部署 ASP.NET Web API, SignalR 和其餘第三方框架,這些框架能夠在 IIS 和 IIS Express, Katana's 自託管主機和自定義主機。
ASP.NET Core 是不強調主機的,它在 Katana 和 OWIN 上行爲一致。ASP.NET Core 也能夠部署在 IIS, IIS Express 或者自託管在你本身的進程裏。另外,ASP.NET Core 也會包含一個叫作 Kestrel 的 Web 服務器,它創建在 libuv 上,主要用於 iOS 和 Linux 操做系統。
ASP.NET Core 提供了一種更加模塊化的 HTTP 請求管道, 你能夠只添加你須要的組件。這個管道再也不依賴 System.Web,經過下降管道中的開銷,你的 app 性能更加優良,更好的調諧 HTTP 協議棧。新的管道基於 Katana 項目經驗,同時支持 OWIN。
Visual Studio 2015 中另外一個很是酷的特性就是支持動態編譯。在過去的 ASP.NET 中,當咱們修改了應用的後臺代碼,咱們須要從新編譯而且運行才能看到頁面的變化。 在新版本的 Visual Studio 中,你不須要再作這些額外的步驟,僅僅是保存你的修改和刷新瀏覽器便可。
這是在刷新頁面以後的輸出:
在過去的 MVC 和 Web API 中,使用路由屬性可能會致使一些問題,尤爲是你正在作一些代碼重構。這是由於路由必須設定爲字符串類型,當你修改了控制器的名字,你就必須修改路由屬性的字符串
MVC Core 提供了新的 [controller] 和 [action] 標記,它們能夠解決這個問題。下面這篇文章重點說明了這些新標記的用法。 : ASP.NET MVC 6 Attribute Routing.
ASP.NET Core 內嵌了對依賴注入和 Service Locator 模式的支持,這意味着你不在須要經過第三方依賴注入框架 Ninject 或 AutoFac。
Visual Studio 2015 內嵌了對流行開源 Web 開發工具的支持。 Grunt 和 Gulp 能夠幫你自動化構建 Web 開發工做流, 你可使用它們來編譯和壓縮 JavaScript 文件。Bower 是一個用於客戶端庫的管理工具,包含 CSS 和 JavaScript 庫。
AngularJs 是當前最流行的前端框架之一,用於構建單頁面應用程序(SPAs)。Visual Studio 包含了用於建立 AngularJs 模塊,控制器,指令和工廠。
對 GruntJS 的支持使得 ASP.NET 成爲一個用於構建客戶端 AngularJs 應用的優秀服務器端框架。 當完成一個版本,你能夠自動合併和壓縮所有 AngularJs 文件。查看個人關於開始在 ASP.NET 中使用 Angular 和 Angular2 的文章 。
· ASP.NET 5: Jump Start to AngularJS with MVC 6 Web API
· ASP.NET Core:Getting Started with AngularJS 2
ASP.NET Core 也是以 SignalR 3 爲基礎,這使得你能夠向雲鏈接的應用程序添加實時功能。查看我以前的 SignalR 例子: ASP.Net SignalR: Building a Simple Real-Time Chat Application
在 ASP.NET Core 中,混亂的 web.config 文件被新的雲就緒配置文件代替,它稱做 「config.json」。微軟但願開發人員更容易地在雲中部署應用程序,並使得應用可以根據特殊環境自動的讀取正確的配置參數。
這是一個新的配置文件的樣子:
因爲 ASP.NET Core 都是插件化的,你須要配置 Stratup 類的源代碼,就像下面這樣:
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath); builder.AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddTransient<MVC6Demo.Models.HeroStats>(); } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); app.UseMvc(m => { m.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action="Index"}); }); }
在以前的 ASP.NET MVC 中,默認的測試框架是 Visual Studio 單元測試框架(有時候也叫做mstest),這個框架使用 [TestClass] 和 [TestMethod] 特性來描述一個單元測試。
ASP.NET Core 使用 xUnit.net 做爲它的單元測試框架。這個框架使用 [Fact] 特性來代替 [TestMethod] 特性,也消除了對 [TestClass] 屬性的依賴。
是的,ASP.NET Core 被做爲一個開源項目託管到 GitHub上, 你能夠查看源代碼,並下載並提交你的更改。
我認同開源的 .NET 會產生重大的意義,它產生了積極的商業意義和社區意義,十分感謝微軟所作出的工做。
以上 ASP.NET Core 1.0 的新特性和新概念的介紹,是爲了更好的幫助咱們使用 ASP.NET Core 進行開發,同時在開發過程當中,咱們還能夠藉助一些好的工具來提升開發效率,並減小代碼量,如 ComponentOne Studio for Asp.net MVC,它兼容 ASP.NET Core RC2 版本,是一款快速輕量級的控件來知足用戶的全部需求。
相關閱讀: