从一个简单的ASP.NET 5站点开启.NET跨平台之旅

作者:   出处:互联网   2015-07-02 22:43:22   阅读:2

在经历了阿里云上“黑色1秒”的空欢喜之后,们“被迫”考虑实现.NET的跨平台,将Web服务器由Windows换成Linux。而这种“被迫”在一个存在已久的愿望下,变得水到渠成。这个愿望就是 —— “Mac上写.NET程序,Linux上跑.NET程序”。


 

AD:

 

 

 


 

在经历了阿里云上 黑色1秒 的空欢喜之后,们 被迫 考虑实现.NET的跨平台,将Web服务器由Windows换成Linux。而这种 被迫 在一个存在已久的愿望下,变得水到渠成。这个愿望就是 Mac上写.NET程序,Linux上跑.NET程序 。


 

既然水也到了,渠也成了,那们还等什么,动身起程吧。


 

今天们以们迈出的第一步 一个部署在Linux上基于dnx/corefx/coreclr的非常简单的ASP.NET 5/MVC 6站点 宣布 .NET跨平台之旅 开启了!


 

这个基于跨平台.NET的站点已经上线,访问网址:http://about.cnblogs.com/ 。


 

该站点部署在CentOS服务器上(部署步骤),服务器上只安装了dnx,没有安装mono,所以是完全基于.NET Core运行。后端Web服务器用的是Kestrel,也是目前跨平台.NET在非Windows平台上唯一能用的Web服务器。


 

CentOS服务器上运行情况如下:


 


[root@about-server AboutUs]# dnx . kestrel
Started


 

前端Web服务器用的是阿里云SLB(负载均衡),如果不用SLB,可以直接在CentOS上用nginx做反向代理。为什么要用前端Web服务器?因为Kestrel Web服务器实在太简陋了,连keep-alive与http compression的功能都没有。


 

该站点的ASP.NET 5程序是在Ubuntu服务器上用vim进行开发的。


 

项目文件结构如下:


 

. ├── Controllers │ ├── AboutController.cs │ └── HomeController.cs ├── Extensions │ └── HtmlHelperExtensions.cs ├── project.json ├── project.lock.json ├── Startup.cs ├── Views │ ├── About │ │ ├── Ad.cshtml │ │ ├── Contact.cshtml │ │ ├── Intro.cshtml │ │ └── Job.cshtml │ ├── Shared │ │ └── _Layout.cshtml │ └── _ViewStart.cshtml └── wwwroot ├── images │ ├── about_cnbogs.gif │ ├── icon_arrow.gif │ └── icon_triangle.gif └── styles └── about.css 


 

project.json文件中的配置:


 

{  webroot :  wwwroot ,  exclude : [ wwwroot ],  commands :{  kestrel :  Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:8001  },  dependencies :{  Kestrel :  1.0.0-* ,  Microsoft.AspNet.Mvc :  6.0.0-* ,  Microsoft.AspNet.StaticFiles :  1.0.0-* ,  Microsoft.AspNet.Diagnostics :  1.0.0-*  },  frameworks :{  dnxcore50 : {} } } 


 

frameworks中只有dnxcore50,说明程序是完全基于.NET Core的。但由于基于coreclr的dnu restore功能目前无法使用,所以在开发环境中不得不安装mono,用基于mono的dnu retore安装nuget包包。


 

Startup.cs中的代码如下:


 
 

using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; namespace CNBlogs.AbouUs.Web { public class Startup { public void Configure(IApplicationBuilder app) { app.UseErrorPage(); app.UseMvcWithDefaultRoute(); app.UseStaticFiles(); } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } } } 


 
 

(注:project.json与Startup.cs中都没有多余的配置与代码)


 

程序非常简单,没有数据库操作,主要就是显示文字内容。稍微复杂些的就是一个HtmlHelpder扩展方法(代码是从现有项目中移植过来的),根据访问的URL自动高亮左侧的导航标签,代码如下:


 

using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; namespace Microsoft.AspNet.Mvc.Rendering { public static class HtmlHelperExtensions { public static HtmlString TabLink(this IHtmlHelper htmlHelper, string linkText, string linkUrl, string viewName) { var view = htmlHelper.ViewContext.View as RazorView; if (view != null   view.Path.IndexOf( /  + viewName +  . , System.StringComparison.OrdinalIgnoreCase)   -1) { return htmlHelper.Raw(string.Format( a href=\ {0}\   >

这个ASP.NET 5程序的代码是一步一步从无到有用vim手写出来的(除了视图与HtmlHelperExtensions), 从中更深刻地了解了ASP.NET 5的一些工作原理,从而也得到了一个运行这个简单的ASP.NET 5程序所需的最小配置。


在开发过程中最痛苦的是修改代码后ASP.NET 5不会自动重新编译,需要重新用dnx运行程序;而且Kestrel目前有bug,无法退出,即使关闭ssh窗口,也照样运行,必须用非常规手段强制结束 进程(ps all; kill -9 [PID])。但Kestrel的这个bug却带来一个让人惊喜的副作用,正因为它一启动就一直运行,怎么也不会退出,相当于以一种后台服务的方式运行, 一下子解决了部署时如何后台运行ASP.NET 5站点的问题。


虽然只是一个非常简单的ASP.NET 5程序,虽然只是.NET跨平台之旅非常非常小的一步,但它却是重要的一步,因为它让们实实在在地感受到了 .NET跨平台,路在脚下。


【更新】


15:35左右,出现异常造成kestrel退出,重新运行dnx之后恢复正常。异常信息如下:



Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.AspNet.Server.Kestrel.Networking.UvShutdownReq.UvShutdownCb(IntPtr ptr, Int32 status)

 


 

Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat