最新版本的 ASP.NET 叫作 ASP.NET Core (也被称为 ASP.NET 5) 它颠覆了过去的 ASP.NET。html
ASP.NET Core 1.0 是一个开源跨平台的开发框架,用于构建基于云的现代 Web 应用 。它是从底层开始从新构建来提供性能优良的Web应用开发框架,能够部署在云上或者本地服务器上。另外,它使得 ASP.NET 应用更加精简和模块化(能够根据你的应用须要向里面添加其余模块),跨平台(你能够很容易的在 Windows, Mac or Linux 上开发和部署你的应用),云优化(你能够在云上在云上部署和调试你的应用)。前端
对于使用 ASP.NET 旧版本的咱们来讲,这意味着什么?git
若是你正在使用旧版本的 ASP.NET 或者你有 WebForms 的开发背景,那么你将会认识到 ASP.NET Core 有多完美,这感受起来就像从古典的 ASP 时代来到全新的 ASP.NET 的世界。github
下面列出 ASP.NET Core 1.0 的核心变化.web
你能够在 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 应用。json
你也能够建立只运行在 windows 下完整 .NET 框架的 ASP.NET Core 应用。windows
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 会产生重大的意义,它产生了积极的商业意义和社区意义,十分感谢微软所作出的工做。