加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

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

发布时间:2022-11-21 12:45:15 所属栏目:Asp教程 来源:
导读:  在经历了阿里云上“黑色1秒”的空欢喜之后,我们“被迫”考虑实现.NET的跨平台,将Web服务器由Windows换成Linux。而这种“被迫”在一个存在已久的愿望下,变得水到渠成。这个愿望
  在经历了阿里云上“黑色1秒”的空欢喜之后,我们“被迫”考虑实现.NET的跨平台,将Web服务器由Windows换成Linux。而这种“被迫”在一个存在已久的愿望下,变得水到渠成。这个愿望就是 —— “Mac上写.NET程序,Linux上跑.NET程序”。
 
  既然水也到了,渠也成了,那我们还等什么,动身起程吧。
 
  今天我们以我们迈出的第一步——一个部署在Linux上基于dnx/corefx/coreclr的非常简单的ASP.NET 5/MVC 6站点——宣布“.NET跨平台之旅”开启了!
 
  这个基于跨平台.NET的站点已经上线,访问网址: 。
 
  该站点部署在CentOS服务器上(部署步骤),服务器上只安装了dnx,没有安装mono,所以是完全基于.NET Core运行。后端Web服务器用的是Kestrel,也是目前跨平台.NET在非Windows平台上唯一能用的Web服务器。
 
  CentOS服务器上运行情况如下:
 
  [root@about-server AboutUs]# dnx . kestrel
  Started
  前端Web服务器用的是阿里云SLB(负载均衡)asp跨平台,如果不用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 :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("{1}", linkUrl, linkText));
 
  }
 
  else
 
  {
 
  return htmlHelper.Raw(string.Format("{1}", linkUrl, linkText));
 
  }
 
  }
 
  }
 
  }
 
  这个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跨平台,路在脚下。
 

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!