分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

写在前面

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

阅读目录:

  • Visual Studio "14" CTP
  • 关于 ASP.NET vNext
  • ASP.NET vNext 实践
  • 后记

  ASP.NET vNext 发布已经过去了一个多月的时间,发布详情请访问:振奋人心呐!关于下一代.NET——ASP.NET vNext 的更多说明,当时看这完篇新闻的第一感觉就像文章标题一样“振奋人心”,其实每个人都有自己的感受,对于我来说,ASP.NET vNext 最大的特性就是跨平台(基于 Mono 运行时),试想下:作为.NET程序员,终于不被Java或C++程序员挑自己的短板,确实是蛮振奋人心的。当然,除了跨平台,使用 Roslyn 编译器动态编译(修改源代码,刷新页面即可)、云优先(Cloud First)、开源等等特性也是蛮重要的。

  以下内容,只是一些个人看法,仅供参考学习,也欢迎讨论指教。

Visual Studio "14" CTP

  Visual Studio "14" CTP(Community Technology Previews)是下一代 Visual Studio 的社区预览版,我个人认为 Visual Studio "14" CTP(以下简称:VS 14 CTP) 就是为 ASP.NET vNext 而量身定做的,当然也包含了其他模块,比如:Store Apps、Cloud等等,以下是关于VS 14 CTP 的版本描述:

CTPs are provided for testing and feedback purposes only. CTPs are unsupported, English-only releases. They are not subject to final validation and are not intended for use on production computers, or to create production code.

Installing a CTP release will place a computer in an unsupported state. For that reason, we recommend only installing CTP releases in a virtual machine, or on a computer that is available for reformatting.

Currently, Visual Studio "14" CTPs have known compatibility issues with previous releases of Visual Studio and should not be installed side-by-side on the same computer.

  从版本中可以看出,VS 14 CTP 仅用于测试和反馈,只提供英文版本,而且安装 VS 14 CTP 会和已有的 Visual Studio 版本冲突,也就是说安装 VS 14 CTP 要把电脑中 Visual Studio 其他版本卸载,才能进行安装。

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  至于“installed side-by-side on the same computer”,因为是先安装的 VS 14 CTP,再安装的 Visual Studio 其他版本,暂时没发现异常情况。

  VS 14 CTP 创建 ASP.NET vNext 项目模块:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  VS 14 CTP 下载地址:

关于 ASP.NET vNext

  ASP.NET vNext 的发布文章称其为.NET下一代,其实我个人觉得并不准确,ASP.NET vNext 就像其名字一样,应该是 ASP.NET 的下一代版本。ASP.NET vNext 代表着.NET的未来的发展方向,比如说跨平台、开源等,也就是 vNext。关于 ASP.NET vNext,园中也有几位大神写过几篇介绍的文章,以下是个人整理关于 ASP.NET vNext 的一些特性(更新时间为6月3日):

  • MVC、 Web API 和 Web Pages合并成一个框架,称为 MVC 6。新的框架使用一组通用的抽象为路由、 行为选择、 筛选器、 模型绑定等等。

  • MVC 6 并不依赖于 System.Web,是一个更精简的框架,用更快的启动时间和内存占用较低(也就是“低内存消耗”以及“高吞吐量”)。

  • ASP.NET vNext 应用程序可以使用云优化(Cloud-Optimized.NET Framework大约 11 M的大小相比于 200 M的完整的框架,也是组成的 NuGet 包的集合(云优化的功劳)。

  • 云优化框架的减少使实际部署的应用程序框架

    • 在同一台服务器上,你可以使用不同版本的 Framework 运行应用程序。
    • 你的应用程序均从服务器上的架构更改,绝缘。
    • 你可以为每个应用程序的 Framework 更新自己的时间表。
    • 当你部署应用造成开发机器上的 Framework 修补程序级别和应用服务器之间不匹配的时候,不会出现任何错误(也就是“绝缘”的意思)。
  • 提供云优化 Framework 的 NuGet 包,可实现以下目标:

    • 按需加载,不必要的部分不会加载到应用程序中。
    • Framework 中,由于每个部分可以独立更新,微软可以将更新变的更快。
  • ASP.NET vNext 与 Host 无关。你可以承载你的应用程序在 IIS 中,或自托管在一个自定义的过程(web API 2 和 SignalR 2 已经支持自托管,ASP.NET vNext 也会给 MVC 带来同样的功能)

  • 支持依赖注入(也可以使用自己的 IoC 容器来注册依赖项)

  • ASP.NET vNext 使用 Roslyn 编译器动态编译代码。你可以编辑一个代码文件,刷新浏览器,并看到所做的更改,并没有重建项目。除了简化开发过程,动态代码编译在现在变得可能,如在 Visual Studio Online ("Monaco") 进行代码编写,你可以选择你自己的编辑器和工具。

  • ASP.NET vNext 开放源代码。

  • ASP.NET vNext 跨平台

  .NET未来构想图,对于 ASP.NET vNext 来说,可以看出尤其侧重于云优化-Cloud Optimized,包含高吞吐量低内存消耗、并行执行和跨平台

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  ASP.NET vNext 成员图:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  从上图可以更直观的看出 ASP.NET vNext 所涵盖的东西,这样的统一管理,带给编程人员好处是很多的,比如:一路由系统、 一个模型绑定系统、 一个筛选器管道等,也可以完美的从 Web Pages 过渡到 MVC。

  .NET vNext 和 .NET vNext -云优化(包含模块)示意图:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  ASP.NET vNext 云优化示意图:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  代码到 Web 服务器示意图,”快速迭代式开发“,即修改代码刷新浏览器,接近实时,也可以实现”云编辑“功能:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  ASP.NET vNext 跨平台示意图:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

ASP.NET vNext 实践

  关于 ASP.NET vNext 的实践,MSDN 已经更新了"Music Store"(音乐商店)项目,感兴趣的朋友可以参考练习下,下面做的 ASP.NET vNext 简单示例,只是个人的学习记录,方面以后自己查看,园友们可以直接略过。

  首先打开 VS 14 CTP,新建 ASP.NET vNext 项目。

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  ASP.NET vNext 主要包含三类模板:

  • ASP.NET vNext Web Application:用于创建 Web 应用程序。
  • ASP.NET vNext Class Library:用于创建云优化类库项目。
  • ASP.NET vNext Console Application:用于创建控制台应用程序。

  新建 vNextDemo 项目后,发现目录结构非常简单.

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  共包含两个项目文件:

  • project.json:配置应用程序所有依赖项。
  • Startup.cs:程序启动类。

project.json

  在 ASP.NET vNext 中看不到我们常用的 config 文件了,取而代之的是 json(或是其他文件类型)配置文件,例如用来配置连接字符串的 config.json 文件:

1 {
2     "Data": {
3         "DefaultConnection": { 
4             "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnetvnext-49c44-d261-476e-b40a-3d9b759fc2da;Trusted_Connection=True;MultipleActiveResultSets=true"
5         }
6     }
7 }

  贴一段 project.json 示例配置

 1 {
 2     "dependencies": {
 3         "Helios": "0.1-alpha-build-0585",
 4         "Microsoft.AspNet.Mvc": "0.1-alpha-build-1268",
 5         "Microsoft.AspNet.Identity.Entity": "0.1-alpha-build-1059",
 6         "Microsoft.AspNet.Identity.Security": "0.1-alpha-build-1059",
 7         "Microsoft.AspNet.Security.Cookies": "0.1-alpha-build-0506",
 8         "Microsoft.AspNet.Server.WebListener": "0.1-alpha-build-0520",
 9         "Microsoft.AspNet.StaticFiles": "0.1-alpha-build-0443",
10         "Microsoft.Data.Entity": "0.1-alpha-build-0863",
11         "Microsoft.Data.Entity.SqlServer": "0.1-alpha-build-0863",
12         "Microsoft.Framework.ConfigurationModel.Json": "0.1-alpha-build-0233",
13         "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0-alpha"
14     },
15     "commands": {
16         /* Change the port number when you are self hosting this application */
17         "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5"
18     },
19     "configurations": {
20         "net45": {
21             "dependencies": {
22                 "System.Data": "",
23                 "System.ComponentModel.DataAnnotations": ""
24             }
25         },
26         "k10": {
27         }
28     }
29 }

  在 dependencies(依赖关系)节点,看起来有点像 NuGet 的 packages.config 配置包,但是不同之处是,以前版本中会直接添加这项项的引用,而且还取决于这些包,现在都是动态配置,比如删除一个引用,它会自动删除所依赖项,如果在 project.json 中未使用,也会动态的移除掉。

  除了 dependencies,还包含 commands(命令)和 configurations(配置)节点,commands 中的”web“配置表示,应用程序默认启动地址,configurations 中的”net45“表示完整的桌面应用程序,”k10“表示云优化。

Startup.cs

  Startup.cs 是整个应用程序的启动类,有点类似于我们常用的 Global.asax,贴一段示例代码(ASP.NET vNext Web Application):

 1 using System;
 2 using Microsoft.AspNet.Builder;
 3 using Microsoft.AspNet.Http;
 4 using Microsoft.AspNet.Identity;
 5 using Microsoft.AspNet.Identity.Security;
 6 using Microsoft.AspNet.Routing;
 7 using Microsoft.AspNet.Security.Cookies;
 8 using Microsoft.Data.Entity;
 9 using Microsoft.Framework.ConfigurationModel;
10 using Microsoft.Framework.DependencyInjection;
11 using WebApplication1.Models;
12 
13 namespace WebApplication1
14 {
15     public class Startup
16     {
17         public void Configure(IBuilder app)
18         {
19             // Enable Browser Link support
20             app.UseBrowserLink();
21 
22             // Setup configuration sources
23             var configuration = new Configuration();
24             configuration.AddJsonFile("config.json");
25             configuration.AddEnvironmentVariables();
26 
27             // Set up application services
28             app.UseServices(services =>
29             {
30                 // Add EF services to the services container
31                 services.AddEntityFramework()
32                     .AddSqlServer();
33 
34                 // Configure DbContext
35                 services.SetupOptions<DbContextOptions>(options =>
36                 {
37                     options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
38                 });
39                 
40                 // Add Identity services to the services container
41                 services.AddIdentity<ApplicationUser>()
42                     .AddEntityFramework<ApplicationUser, ApplicationDbContext>()
43                     .AddHttpSignIn();
44 
45                 // Add MVC services to the services container
46                 services.AddMvc();
47             });
48 
49             // Add static files to the request pipeline
50             app.UseStaticFiles();
51 
52             // Add cookie-based authentication to the request pipeline
53             app.UseCookieAuthentication(new CookieAuthenticationOptions
54             {
55                 AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
56                 LoginPath = new PathString("/Account/Login"),
57             });
58 
59             // Add MVC to the request pipeline
60             app.UseMvc(routes =>
61             {
62                 routes.MapRoute(
63                     name: "default", 
64                     template: "{controller}/{action}/{id?}",
65                     defaults: new { controller = "Home", action = "Index" });
66 
67                 routes.MapRoute(
68                     name: "api",
69                     template: "{controller}/{id?}");
70             });
71         }
72     }
73 }

  可以看出 Startup 的 Configure 方法包含一个 IBuilder 类型的参数,上段代码表示:

  • 添加浏览器链接

  • 配置系统配置,来自 config.json 和环境变量的值

  • 添加 EntityFramework

  • 添加 ASP.NET Identity

  • 添加 ASP.NET MVC

vNextDemo.kproj

  使用 VS 14 CTP 创建 ASP.NET vNext 项目的时候,会产生”.kproj“后缀的项目文件,有点类似于我们平常见到的”.csproj“文件,功能是差不多的,都是管理项目中文件,因为 ASP.NET vNext 将支持"云编辑",所以这种文件将在 VS 14 CTP 的后续版本中不复存在。

In this preview release you’ll find that all files in your project are listed in the .kproj file. In later versions the files will not be listed in the .kproj.

Views and Controller

  Views(视图)和 Controller(控制器)的创建和 ASP.NET MVC 差不多,贴一下简单示例代码:

  Views:

1 @*
2     For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
3 *@
4 @{
5     // Layout = "/Views/Shared/_Layout.cshtml";
6     // ViewBag.Title = "Home Page";
7 }
8 <h1>@ViewBag.Message</h1>

  Controller

 1 using Microsoft.AspNet.Mvc;
 2 
 3 // For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
 4 
 5 namespace vNextDemo.Controllers
 6 {
 7     public class HelloWorldController : Controller
 8     {
 9         // GET: /<controller>/
10         public IActionResult Index()
11         {
12             ViewBag.Message = "Hello World";
13             return View();
14         }
15     }
16 }

  Views 和 Controller 创建完之后,需要在 project.json 文件中配置 MVC 依赖关系:"Microsoft.AspNet.Mvc": "0.1-alpha-build-1268",格式为:“项目名称”:“”,网上说支持智能提示(还有小图标显示),不知是不是我 VS 14 CTP 安装问题(好像安装完成后有个警告,当时没仔细看),导致没有智能提示。

Startup -> Configure

  上面基本代码编写完之后,需要在 Startup 中添加 MVC 及 MVC 路由配置,示例代码:

 1 using Microsoft.AspNet.Routing;
 2 using Microsoft.AspNet.Builder;
 3 using Microsoft.Framework.DependencyInjection;
 4 
 5 namespace vNextDemo
 6 {
 7     public class Startup
 8     {
 9         public void Configure(IBuilder app)
10         {
11             app.UseServices(services =>
12             {
13                 services.AddMvc();
14             });
15 
16             app.UseMvc(routes =>
17             {
18                 routes.MapRoute(
19                     name: "Default",
20                     template: "{controller}/{action}/{id?}",
21                     defaults: new { controller = "HelloWorld", action = "Index" });
22             });
23         }
24     }
25 }

Start

  直接运行调试:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  也可以通过 commands 配置 self-host,如下:

1     "commands": {
2         "web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5" 
3     },

  文件发布,也可以进行 Windows Azure 发布:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  Web Publish Activity 发布成功提示:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  点击发布文件中的“web.cmd”,过几秒提示“Started”,表示程序已启动,打开浏览器,输入:http://localhost:5/,就可以浏览了。

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  MSDN 中很多博文讲到命令行配置,也就是:kpm restore 或 k web,kpm restore 命令表示解析 project.json 文件中列出的依赖关系,并下载所需的 NuGet 包,k web 命令表示启动的 HTTP 侦听器,但文中没有详细的配置方法,如下:

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  上述示例只是 ASP.NET vNext 的简单创建,并不包含其特性,贪多嚼不烂,关于 ASP.NET vNext 的特性应用后续探讨,比如跨平台、云优化等。

  示例代码下载:http://pan.baidu.com/s/1haagY

后记

  个人觉得性能和平台问题,一直是.NET的痛处,ASP.NET vNext 的发布让我们.NET狂热者看到了曙光,我觉得这不只是一个版本发布的问题,而是一个里程碑,可以载入.NET发展史册,虽然仅仅发布一个多月的时间,但是在 MSDN 中,关于 ASP.NET vNext,已经有超过7多篇博文发表,也希望博客园的园友们可以贡献出自己的一份力量。

分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

  凡事贵在开始,对于.NET的未来,我觉得 ASP.NET vNext 就是一个不错的开始。

  如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^

  参考资料:

更多相关文章
  •  SQL Server 2005 & 2008 master与msdb数据库的备份与恢复枢木 2011-05-11====================================================================master与msdb数据库的备份与普通数 ...
  • 前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性.上次说过,方法可以理解为委托的实例,站在方法的层面,委托实例的一个非常有用的特性是它既不知道,也不 ...
  • Excel批注常用于为个别的单元格添加注释,读者能够从注释中获取额外的信息.批注可隐藏,只会在单元格右上方显示红色三角,添加后不会对单元格的内容喧宾夺主.在日常编程处理Excel中,为个别单元格添加备注信息,也有必要.这篇博文主要介绍使用免费版的Spire.XLS在C#中为单元格添加备注,并设置位置 ...
  • Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:   Integers in each row are sorted ...
  • 据媒体的最新报道,在安全领域,360又一次将自己与百度的商业竞争演变成了对网民的恐吓:只要网民电脑有360安全卫士在后台运行,那么安装百度的软件的时候,就会遭到360的恶意阻拦甚至"建议清除". 看到这个消息,我几乎已经见怪不怪.但还是忍不住要啰嗦两句,因为我发现还有很多的用户并 ...
  • 从今年5月28日得到小米手环开始,自己也在不断关注智能穿戴设备对自己生活的改变. 首先,谈一下这41天来的使用感受.从带上小米手环开始,第一个体验的就是运动检测功能.通过为自己设置运动目标,迫使自己不断关注身体运动情况,在不断完成目标的情况下,自己也可以在一定程度上优化体制,这点对于IT人事来说还是 ...
一周排行
  • 最近发现无论是打电话还是发邮件,必须加上,姓名-…这他妈别人的事就这么多吗都记得记得里?我就真纳闷了…记得那会刚上大一时补办银行卡,刚刚给辅导员打完电话,时间就没隔多久…再打竟然最后来了句:你是谁?第一次感觉自己如此 ...
  • "EditText + Button" 形成一个"输入+按键响应" 的案例在android编程中是最常见不过的了.   但还有一些细节需要注意:   在EditText输入后, ...
  • 前面的准备工作都基本差不多了,这篇CC将介绍如何将Enterprise Edition Server添加到池 本章节分为 1.将服务器添加到池 2.配置证书 3.手动在IIS中添加证书 4.手动验证复制 5.启动服务 ...
  • 有时候写一些shell脚本时,想获取一下一写语句的输出,比如我使用javac 编译一个java类的时候,我想知道编译是否通过,那么很容易想到的就是根据javac的输出结果来判断 .             在终端下输 ...
  • 这篇文章可以供初学者参考. 第一:mysql的安装 1):下载mysql的安装包,我习惯把安装包放到/usr/local/src/这个目录下 cd /usr/local/src/ wget http://syslab ...
  • 最近google.com.hk也打不开了 ,ping下服务器  IP地址: 74.125.203.199美国  结果服务器在美国 谷歌不能上 只好用百度 不过谷歌的检索结果确实比百度准确性高很多  不过居然发现有些网 ...
  • 摘自 ghostgant的专栏
  • 最亲的人,你最应该懂 --写在爸爸自传前的序言 一晚,和妹妹聊天,她突然说:姐,咱给老爸开个博客吧,把他的自传放上去-- 提起爸爸的自传,一时思绪万千-- 说到老爸的自传,最早追溯到90年代初,不记得是哪一天,他突然 ...
  • 在SourceSafe  Admin里面设置一下选项 Tools->Options->General->expand  keywords  in  files  of  type 意思是为以下类型的 ...
  • 类"秘密"应用是昙花一现还是会星火燎原?下定论尚早 一款聚集了匿名吐槽.爆料与谣言.人身攻击的应用"秘密",在小范围内红了,同时带来一些争议.客观看,在可预见的未来,Faceb ...