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

 

在经历了阿里云上“黑色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进行开发的。

项目文件结构如下:


  1. ├── Controllers 
  2. │   ├── AboutController.cs 
  3. │   └── HomeController.cs 
  4. ├── Extensions 
  5. │   └── HtmlHelperExtensions.cs 
  6. ├── project.json 
  7. ├── project.lock.json 
  8. ├── Startup.cs 
  9. ├── Views 
  10. │   ├── About 
  11. │   │   ├── Ad.cshtml 
  12. │   │   ├── Contact.cshtml 
  13. │   │   ├── Intro.cshtml 
  14. │   │   └── Job.cshtml 
  15. │   ├── Shared 
  16. │   │   └── _Layout.cshtml 
  17. │   └── _ViewStart.cshtml 
  18. └── wwwroot 
  19.     ├── images 
  20.     │   ├── about_cnbogs.gif 
  21.     │   ├── icon_arrow.gif 
  22.     │   └── icon_triangle.gif 
  23.     └── styles 
  24.         └── 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中的代码如下:

 


  1. using Microsoft.AspNet.Builder; 
  2. using Microsoft.Framework.DependencyInjection; 
  3.  
  4. namespace CNBlogs.AbouUs.Web 
  5.     public class Startup 
  6.     { 
  7.         public void Configure(IApplicationBuilder app) 
  8.         { 
  9.             app.UseErrorPage(); 
  10.  
  11.             app.UseMvcWithDefaultRoute(); 
  12.  
  13.             app.UseStaticFiles(); 
  14.         } 
  15.  
  16.         public void ConfigureServices(IServiceCollection services) 
  17.         { 
  18.             services.AddMvc(); 
  19.         } 
  20.     } 

 

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

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


  1. using Microsoft.AspNet.Mvc.Razor; 
  2. using Microsoft.AspNet.Mvc.Rendering; 
  3.  
  4. namespace Microsoft.AspNet.Mvc.Rendering 
  5.     public static class HtmlHelperExtensions 
  6.     { 
  7.         public static HtmlString TabLink(this IHtmlHelper htmlHelper, string linkText, string linkUrl, string viewName) 
  8.         { 
  9.             var view = htmlHelper.ViewContext.View as RazorView; 
  10.             if (view != null && view.Path.IndexOf("/" + viewName + ".", System.StringComparison.OrdinalIgnoreCase) > -1) 
  11.             { 
  12.                 return htmlHelper.Raw(string.Format("<a href=\"{0}\" class=\"current\">{1}</a>", linkUrl, linkText)); 
  13.             } 
  14.             else 
  15.             { 
  16.                 return htmlHelper.Raw(string.Format("<a href=\"{0}\">{1}</a>", linkUrl, linkText)); 
  17.             } 
  18.         } 
  19.     } 

这个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)

 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索aspnet
, net
, 程序
, 运行
, 跨平台
, project.json
, microsoft
, java中使用kestrel
, asp.net 后台修改网址
, MVC站点
, MVC阿里大于
, Kestrel
DNX
,以便于您获取更多的相关知识。

时间: 2025-01-27 07:06:10

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

使用C# Builder创建一个简单的ASP.NET应用程序

一般网站建设通常要求开发人员做后台的程序设计,前面有专业的美工做界面设计.虽然有时候开发人员也会做些界面设计,但是通常都无法达到专业的要求.在以前的ASP中,由于代码和HTML页面语言混杂在一起,这就使得网站的建设变得相当的困难.但在ASP.NET中,这种情况完全改变了.下面就用C# Builder创建一个简单的ASP.NET应用程序. 打开C# Builder,选择 File>New>other-菜单项,你将会看到下面的窗口: 我们选择C# ASP Projects,你就会看到右边有3种可供

asp net 管理系统-求一个简单的asp的web页面管理系统,只要求实现增删改查就行

问题描述 求一个简单的asp的web页面管理系统,只要求实现增删改查就行 求大神发一个初学者的管理给我,顺带讲解讲解,实在做不出来....................qq:732796124

ASP实例:一个简单的ASP无组件上传类

简单的ASP无组件上传类,发出来让大家看看.可以做做实验! 以下为引用的内容: <%@ language="javascript"%><%var self = Request.serverVariables("SCRIPT_NAME");if (Request.serverVariables("REQUEST_METHOD")=="POST"){        var oo = new uploadFile(

一个简单的asp.net 管理Web站点文件的页面程序

先看效果 WebFileManager  代码如下 复制代码 <!-- Author: 张浩华 DateTime: 2012-07-06 03:25 ----------------------------------- 管理Web站点下文件的页面程序. 提供上传.重命名.删除.创建文件夹.下载等功能. --> <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1

一个简单的ASP问题,高手帮忙指教!

问题描述 mailbody=mailbody+"蓝色套装"+lantao+"绿色套装"+lvtao+"红色套装"+hongtao+"干粉"+ganf+"<br>"我用JMAIL组件发邮件,mailbody是邮件的内容.lantao,lvtao都是文本框的值,都是数字.蓝色套装,绿色套装等是值的说明.如果我买了蓝色套装1套,绿色套装3套.文本框的值lantao=1lvtao=3我收到的邮件内容为:

小试牛刀,制作一个简单的ASP.NET程序

asp.net|程序 通过学习上面几节让人头痛的概念和辛苦的安装配置工作后,我们已经具备了开发ASP.NET 程序的初步知识和运行平台了,那么,让我们就开始进入ASP.NET的世界,感受ASP.NET精彩吧. 我们使用最"简陋"的开发工具――记事本,来建议第一个ASP.NET的页面,在记事本里添加如下代码: <%@ Page Language="VB" %> <html> <head> <title>My First

一个简单的ASP+留言板程序

asp+|程序 这是我第一次写,还请大家多指教 只看了一天的CSharp就蠢蠢欲试,参考了NGWS的帮助文档,写了个留言板小程序. 本程序使用SQL SERVER7,库里只有4个字段: [GuestBook] book_id UserName Post_Time Content 因为对CSharp掌握还不好,写得有点乱,其实很多地方可以写得简单点.输出数据时可以使用不同的方法,我是用了服务器自带的控件Repeater来输出:还可以用getString的方法读取数据.值得研究的地方还有很多哦,呵呵

一个简单的ASP.NET Forms 身份认证

asp.net 当访问默认首页default.aspx时,会自动跳转到login.aspx页面上请求登录,随便输入用户名和密码,点击"登录"按钮,会回到首页,并显示当前登录的用户名. Web.config<configuration> <system.web> <compilation debug="true"/> <authentication mode="Forms"> <forms lo

一个简单的ASP.MVC分页控件

分页功能实现方面参考了网上的一些内容,加上自己的一些修改,使用方式如 下: (鉴于分页代码基本上和别人的没什么两样,所以这里就省略了.) 封装扩展方法 public static string Pager(this HtmlHelper html, IPageData model, bool alwaysShow,bool showNumber) { string text = "<!--没有任何数据,所以不显示分页控件-->"; bool show = model.Tot