背景最新版本的 ASP.NET 叫做 ASP.NET Core (也被稱為 ASP.NET 5) 它顛覆了過(guò)去的 ASP.NET。 什么是 ASP.NET Core?ASP.NET Core 1.0 是一個(gè)開(kāi)源跨平臺(tái)的開(kāi)發(fā)框架,用于構(gòu)建基于云的現(xiàn)代 Web 應(yīng)用 。它是從底層開(kāi)始重新構(gòu)建來(lái)提供性能優(yōu)良的Web應(yīng)用開(kāi)發(fā)框架,可以部署在云上或者本地服務(wù)器上。另外,它使得 ASP.NET 應(yīng)用更加精簡(jiǎn)和模塊化(可以根據(jù)你的應(yīng)用需要向里面添加其他模塊),跨平臺(tái)(你可以很容易的在 Windows, Mac or Linux 上開(kāi)發(fā)和部署你的應(yīng)用),云優(yōu)化(你可以在云上在云上部署和調(diào)試你的應(yīng)用)。 以前的版本對(duì)于使用 ASP.NET 舊版本的我們來(lái)說(shuō),這意味著什么? 如果你正在使用舊版本的 ASP.NET 或者你有 WebForms 的開(kāi)發(fā)背景,那么你將會(huì)認(rèn)識(shí)到 ASP.NET Core 有多完美,這感覺(jué)起來(lái)就像從古典的 ASP 時(shí)代來(lái)到全新的 ASP.NET 的世界。 現(xiàn)在,讓我們來(lái)一探究竟下面列出 ASP.NET Core 1.0 的核心變化. 跨平臺(tái)的運(yùn)行時(shí)你可以在 OSX 和 Linux上運(yùn)行 ASP.NET Core 應(yīng)用,這對(duì)于 ASP.NET 來(lái)說(shuō),這具有跨時(shí)代的意義,也給 ASP.NET 開(kāi)發(fā)者和設(shè)計(jì)師們帶來(lái)了全新的體驗(yàn)。ASP.NET Core 具有兩個(gè)運(yùn)行時(shí),這意味著你可以選擇不同的運(yùn)行環(huán)境來(lái)部署你的應(yīng)用,使得你的應(yīng)用將更加靈活。 ASP.NET Core 1.0 是一個(gè) ASP.NET 的重構(gòu)版本,它運(yùn)行于最新的 .NET Core。它是模塊化的,允許開(kāi)發(fā)者以插件的形式添加應(yīng)用所需要的模塊,大多數(shù)的功能都將作為插件提供并通過(guò) NuGet 程序包管理。這樣做的一個(gè)好處就是你可以升級(jí)應(yīng)用的一個(gè)模塊,但絲毫不會(huì)影響其他模塊;另外,.NET Core 是一個(gè)跨平臺(tái)的運(yùn)行時(shí),因此你可以在 OSX 或 Linux 操作系統(tǒng)上部署你的應(yīng)用;它也是一個(gè)云優(yōu)化的運(yùn)行時(shí),用于在云上部署和調(diào)試應(yīng)用;.NET Core 可以和你的應(yīng)用程序一起被部署,當(dāng)服務(wù)器上有多個(gè) .NET Core 版本時(shí), 你依舊可以運(yùn)行 ASP.NET Core 應(yīng)用。 你也可以創(chuàng)建只運(yùn)行在 windows 下完整 .NET 框架的 ASP.NET Core 應(yīng)用。 ASP.NET 4.6 是最新的完整 .NET Framework 的發(fā)布版本,它允許你可以利用所有的 .NET 組件并且具備向后兼容能力。如果你計(jì)劃將應(yīng)用遷移到 .NET core,那么你需要做適量的修改,因?yàn)?.NET Core 相對(duì)于完整 .NET Framework 來(lái)說(shuō)有所限制。 需要明確的是,ASP.NET 4.6 更加成熟。它如今久經(jīng)考驗(yàn)并且現(xiàn)已發(fā)布并可使用。ASP.NET Core 1.0 是1.0 發(fā)布版本,包含 Web API 和 MVC,但是現(xiàn)在還沒(méi)有 SignalR 和 Web Pages。,它也不支持VB 和 F# 語(yǔ)言。 ASP.NET Core 不再只依賴Visual StudioASP.NET Core 的跨平臺(tái),讓它不再只依賴 Visual Studio,開(kāi)發(fā)者和設(shè)計(jì)師們可以在自己喜歡的環(huán)境上工作。比如 Sublime Text,WebStorm ,這真是太棒了! 新的工程解決方案結(jié)構(gòu)如果你使用 Visual Studio 創(chuàng)建了一個(gè)空的 ASP.NET Core 工程,那么你將會(huì)看到下面的驚喜。(除非你沒(méi)有使用之前的 ASP.NET 創(chuàng)建過(guò)任何項(xiàng)目) 你感覺(jué)到驚喜了嗎?新的工程結(jié)構(gòu)完全不一樣了, 工程模板煥然一新,包含以下的新文件: · global.json: 你可以在這里放置解決方案的配置信息和工程之間的引用。 · Program.cs: 這個(gè)文件包含了 ASP.NET Core RC2 應(yīng)用的 Main 方法,負(fù)責(zé)配置和啟動(dòng)應(yīng)用程序。 · src folder: 包含組成你應(yīng)用程序的全部項(xiàng)目代碼。 · wwwroot: 你的靜態(tài)文件將被放置在這個(gè)文件夾,它們都將作為資源直接提供給客戶端,包含 HTML,CSS 和 JavaScript 文件。 · project.json: 包含項(xiàng)目設(shè)置。在 ASP.NET Core中,你可以通過(guò)使用 NuGet 程序包管理工具(NPM)添加 NuGet 包或者編輯這個(gè)文件來(lái)管理從屬。你可以通過(guò)任何文本編輯器來(lái)編輯這個(gè)文件,如果你使用 Visual Studio 2015,,這將會(huì)更加 輕松,因?yàn)樗闹悄芴崾緯?huì)幫助你找到合適的 NuGet 包作為從屬。project.json 就像下面這樣。 · startup.cs 這個(gè)主要放置你 ASP.NET Core 的 stratup 和 configuration 代碼,下面就是 stratup 類的樣子。 ConfigureServices 方法定義了你應(yīng)用程序使用的服務(wù),Configure 方法用來(lái)定義組成請(qǐng)求管道的中間件。 · References: 它包含了 .NETCoreApp 第一個(gè)版本運(yùn)行時(shí)的引用。 WebForms是的,WebForms 不再是 ASP.NET 5 的一部分,這真令人悲傷。你可以繼續(xù)使用 VS2015 的 .NET 4.6 來(lái)構(gòu)建 Web Forms 應(yīng)用,但是卻不能體會(huì) ASP.NET 5 的新特性了。 我已經(jīng)開(kāi)發(fā)了很多年從小型到大型的企業(yè)級(jí) Web Forms 應(yīng)用。 我很喜歡 Web Forms,,事實(shí)上我還會(huì)繼續(xù)支持在各種論壇使用 WebForms 的社區(qū),比如 http://forums.。但是我們是時(shí)候進(jìn)步了,去學(xué)習(xí)一些新東西。這是學(xué)習(xí) ASP.NET MVC 最后的時(shí)間了,就像過(guò)去的許多事物,你要么去適應(yīng),要么被淘汰。 除了 WebForms, the .NET Core 也沒(méi)有包含 Windows Forms, WCF, WPF, Silverlight 等等。 VB.NET and F#目前,在當(dāng)前 ASP.NET Core 1.0 RC2 版本中, VB.NET 和 F# 也不被支持。 MVC Core 統(tǒng)一架構(gòu)ASP.NET Core 將見(jiàn)證 MVC, Web API 和 Web Pages(可能包含)組合在一個(gè)架構(gòu)中,它被稱為 ASP.NET MVC Core。盡管當(dāng)前發(fā)布版本中,還不支持 Web Pages and SignalR。 在之前的 ASP.NET MVC 中, MVC 控制器和 Web API 控制器是不同的。 一個(gè) MVC 控制器使用基類 System.Web.MVC.Controller ,一個(gè) Web API 控制器使用基類 System.Web.Http.ApiController 。 在 MVC Core 中,會(huì)為它們提供一個(gè)共同的基類,就是 Microsoft.AspNetCore.Mvc.Controller 。 對(duì)于 HTML Helpers 來(lái)說(shuō),MVC 和 Web Pages 的合并是非常有可能的。 Web Pages 編程模型對(duì)當(dāng)前版本來(lái)說(shuō)還不適用,所以我們還不能負(fù)責(zé)任地說(shuō)下一步計(jì)劃合并哪些特性。 但是我們可以預(yù)測(cè)到,傳統(tǒng)的 MVC 模型綁定將會(huì)出現(xiàn)。 View Components在之前 ASP.NET MVC 中,, Html.Action() 幫助方法一般用于調(diào)用一個(gè) sub-controller。ASP.NET MVC Core 將會(huì)使用新的 View Components 用來(lái)代替使用Html.Action() 的部件。 View Components 支持完全異步,這允許你創(chuàng)建異步的視圖組件。 下面是一個(gè)簡(jiǎn)單的視圖組件的例子,根據(jù)身份會(huì)返回個(gè)人介紹。 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> 這里展示了如何在主視圖中調(diào)用 View Components <div> @await Component.InvokeAsync("PersonList", new { type = "Registered" }) </div> 新指令: @inject, @using, @inheritsASP.NET MVC Core 提供了少量新指令。 下面我們來(lái)看看如何使用 @inject。 @inject 指令允許你注入一個(gè)類中的方法到你的視圖中。 這是一個(gè)簡(jiǎn)單的類,來(lái)展示一些異步的方法。 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()); } } } 現(xiàn)在我們就可以在視圖中使用 @inject 指令來(lái)調(diào)用那些方法: @inject MVC6Demo.Models.Stats Stats @{ ViewBag.Title = "Stats"; } <div> 這是不是很酷? 查看我關(guān)于 ASP.NET MVC 新指令詳細(xì)例子的文章: Getting Started with ASP.NET MVC Core Tag HelpersASP.NET MVC Core 另外一個(gè)非??岬臇|西就是 Tag Helpers。對(duì)于之前的 HTML Helpers,Tag Helpers 是可選的替代語(yǔ)法。 所以相比于以下代碼: @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> ASP.NET Core 不止可以部署在IIS上14年前,ASP.NET 平臺(tái)基本只能部署在一種服務(wù)器上,那就是 IIS。幾年之后,Visual Studio Development Web Server(也叫作“Cassini”)作為一種開(kāi)發(fā)服務(wù)被使用,但是它們最終都是調(diào)用 System.Web 作為應(yīng)用程序和 Web 服務(wù)器中間的主機(jī)層。System.Web 主機(jī)與 IIS 耦合度很高,所以要想運(yùn)行在另一臺(tái)主機(jī)上會(huì)非常困難。 后來(lái) OWIN 作為應(yīng)用程序和 Web 服務(wù)器中間的接口出現(xiàn)。 Microsoft 開(kāi)發(fā)了 Katana 作為一個(gè) OWIN 的實(shí)現(xiàn),可以部署 ASP.NET Web API, SignalR 和其他第三方框架,這些框架可以在 IIS 和 IIS Express, Katana's 自托管主機(jī)和自定義主機(jī)。 ASP.NET Core 是不強(qiáng)調(diào)主機(jī)的,它在 Katana 和 OWIN 上行為一致。ASP.NET Core 也可以部署在 IIS, IIS Express 或者自托管在你自己的進(jìn)程里。另外,ASP.NET Core 也會(huì)包含一個(gè)叫做 Kestrel 的 Web 服務(wù)器,它建立在 libuv 上,主要用于 iOS 和 Linux 操作系統(tǒng)。 新的HTTP請(qǐng)求管道ASP.NET Core 提供了一種更加模塊化的 HTTP 請(qǐng)求管道, 你可以只添加你需要的組件。這個(gè)管道不再依賴 System.Web,通過(guò)降低管道中的開(kāi)銷,你的 app 性能更加優(yōu)良,更好的調(diào)諧 HTTP 協(xié)議棧。新的管道基于 Katana 項(xiàng)目經(jīng)驗(yàn),同時(shí)支持 OWIN。 動(dòng)態(tài)的Web開(kāi)發(fā)Visual Studio 2015 中另一個(gè)非??岬奶匦跃褪侵С謩?dòng)態(tài)編譯。在過(guò)去的 ASP.NET 中,當(dāng)我們修改了應(yīng)用的后臺(tái)代碼,我們需要重新編譯并且運(yùn)行才能看到頁(yè)面的變化。 在新版本的 Visual Studio 中,你不需要再做這些額外的步驟,僅僅是保存你的修改和刷新瀏覽器即可。 這是在刷新頁(yè)面之后的輸出: Attribute Routing: [controller] 和 [action] 標(biāo)記在過(guò)去的 MVC 和 Web API 中,使用路由屬性可能會(huì)導(dǎo)致一些問(wèn)題,尤其是你正在做一些代碼重構(gòu)。這是因?yàn)槁酚杀仨氃O(shè)定為字符串類型,當(dāng)你修改了控制器的名字,你就必須修改路由屬性的字符串 MVC Core 提供了新的 [controller] 和 [action] 標(biāo)記,它們可以解決這個(gè)問(wèn)題。下面這篇文章重點(diǎn)說(shuō)明了這些新標(biāo)記的用法。 : ASP.NET MVC 6 Attribute Routing. 集成的依賴注入 (DI)ASP.NET Core 內(nèi)嵌了對(duì)依賴注入和 Service Locator 模式的支持,這意味著你不在需要通過(guò)第三方依賴注入框架 Ninject 或 AutoFac。 集成 Grunt, Gulp and BowerVisual Studio 2015 內(nèi)嵌了對(duì)流行開(kāi)源 Web 開(kāi)發(fā)工具的支持。 Grunt 和 Gulp 可以幫你自動(dòng)化構(gòu)建 Web 開(kāi)發(fā)工作流, 你可以使用它們來(lái)編譯和壓縮 JavaScript 文件。Bower 是一個(gè)用于客戶端庫(kù)的管理工具,包含 CSS 和 JavaScript 庫(kù)。 內(nèi)置的AngularJs模板AngularJs 是當(dāng)前最流行的前端框架之一,用于構(gòu)建單頁(yè)面應(yīng)用程序(SPAs)。Visual Studio 包含了用于創(chuàng)建 AngularJs 模塊,控制器,指令和工廠。 對(duì) GruntJS 的支持使得 ASP.NET 成為一個(gè)用于構(gòu)建客戶端 AngularJs 應(yīng)用的優(yōu)秀服務(wù)器端框架。 當(dāng)完成一個(gè)版本,你可以自動(dòng)合并和壓縮全部 AngularJs 文件。查看我的關(guān)于開(kāi)始在 ASP.NET 中使用 Angular 和 Angular2 的文章 。 · ASP.NET 5: Jump Start to AngularJS with MVC 6 Web API · ASP.NET Core:Getting Started with AngularJS 2 SignalR 3ASP.NET Core 也是以 SignalR 3 為基礎(chǔ),這使得你可以向云連接的應(yīng)用程序添加實(shí)時(shí)功能。查看我之前的 SignalR 例子: ASP.Net SignalR: Building a Simple Real-Time Chat Application Web.Config在 ASP.NET Core 中,混亂的 web.config 文件被新的云就緒配置文件代替,它稱作 “config.json”。微軟希望開(kāi)發(fā)人員更容易地在云中部署應(yīng)用程序,并使得應(yīng)用能夠根據(jù)特殊環(huán)境自動(dòng)的讀取正確的配置參數(shù)。 這是一個(gè)新的配置文件的樣子: 由于 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"}); }); } xUnit.Net: .NET 新的單元測(cè)試工具在之前的 ASP.NET MVC 中,默認(rèn)的測(cè)試框架是 Visual Studio 單元測(cè)試框架(有時(shí)候也叫作mstest),這個(gè)框架使用 [TestClass] 和 [TestMethod] 特性來(lái)描述一個(gè)單元測(cè)試。 ASP.NET Core 使用 xUnit.net 作為它的單元測(cè)試框架。這個(gè)框架使用 [Fact] 特性來(lái)代替 [TestMethod] 特性,也消除了對(duì) [TestClass] 屬性的依賴。 絕對(duì)的免費(fèi)和開(kāi)源是的,ASP.NET Core 被作為一個(gè)開(kāi)源項(xiàng)目托管到 GitHub上, 你可以查看源代碼,并下載并提交你的更改。 我認(rèn)同開(kāi)源的 .NET 會(huì)產(chǎn)生重大的意義,它產(chǎn)生了積極的商業(yè)意義和社區(qū)意義,十分感謝微軟所做出的工作。 以上 ASP.NET Core 1.0 的新特性和新概念的介紹,是為了更好的幫助我們使用 ASP.NET Core 進(jìn)行開(kāi)發(fā),同時(shí)在開(kāi)發(fā)過(guò)程中,我們還可以借助一些好的工具來(lái)提高開(kāi)發(fā)效率,并減少代碼量,如 ComponentOne Studio for Asp.net MVC,它兼容 ASP.NET Core RC2 版本,是一款快速輕量級(jí)的控件來(lái)滿足用戶的所有需求。
文章來(lái)源:By Vincent Maverick Durano, 10 Jun 2016 原文鏈接:http://www./Articles/1104668/Introducing-ASP-NET-Core-The-New-ASP-NET-in-Town |
|
來(lái)自: 命運(yùn)之輪 > 《C# and ASP.NET》