微软的跨平台战略

微软在过去的一年多中时间中发生了令整个 IT 行业感到惊叹的变化。这一切始于 Ballmer 的退位和 Nadella 的决心,更始于早已在微软各个基层部门蠢蠢欲动的二次创业。

以开发工具团队来说,他们很早就开源了 ASP.NET MVC 开发框架,并从那以后连续开源了后续全部新的开发框架,例如 Web API 和 SignalR,例如 OWIN 组件 Katana,并且和开源社区如 Mono 保持着良好的互动。

而其他团队,例如 Hyper-V,则同样与 Linux 内核社区有积极互动。

图一:微软 CEO Nadella 先生表示 Microsoft Loves Linux

因此当 Nadella 先生在2014年10月表态 Microsoft Loves Linux 时,长期的微软观察家应该并不会表现出太多惊讶,因为这真的只是个水到渠成的过程。

以 ASP.NET 为例,业界的公司早已或多或少的使用了 Linux 或者基于 Linux 平台的解决方案。因此如果微软提供 ASP.NET 跨平台开发和部署支持,那么此前完全采用 Linux 的公司可以直接在现有平台上部署网站,从而节约购买 Windows 授权的费用。混合使用 Linux 和 Windows 的公司则有机会重新调整平台间的相对规模,达成成本控制目标。

除去公司内部计算平台,在多种主流公有云平台上,采用 Linux 虚拟机为主的解决方案也非常普遍,成本低廉,同时适合各种级别的公司和个人来部署网站应用。

因此只要微软 ASP.NET 技术能够支持跨平台开发部署,那么就能立即进入一个全新的市场领域。

.NET Core 5 和 ASP.NET 5

为了达成跨平台目标,微软开发工具部门在发布了 .NET 4.5 和 ASP.NET 4.5 之后花了相当长的时间来构架下一代网站开发技术。在这个超过两年的漫长过程中,以下几个目标逐渐清晰,

  1. 采用新思路来重新设计框架基础。这方面向 node.js 学习不少。
  2. 采用全新技术,主要是 Roslyn。
  3. 脱离 .NET Framework 的束缚实现跨平台。

结果就是我们现在已经看到的 ASP.NET 5。

图二:ASP.NET 5

为了使得 ASP.NET 5 运行在新平台上,.NET 团队也借此机会开发了全新的运行环境,也就是 .NET Core 5。

.NET Core 5 完全开源,整个开发过程和全部代码都可以在 GitHub 上面找到。它的 API 参考资料可以在下面找到,

https://dotnet.github.io/api/index.html

一个明显的变化是很多我们熟悉的 .NET Framework 类型被删除了,例如 System.Security.Cryptography 下面的一些类型,System.Net 下面的 UdpClient 类型和 Socket 类型的同步方法。

在 VS 2015 中新建一个 .NET Core 函数库工程的时候,也有很大变化。首先就是工程类型变成了 .xproj,依赖项管理方式改为通过 project.json 文件指定,而编译结果也换成了 NuGet 包。

ASP.NET 5 方面同样如此,完全开源之外也带来了很大的变化。System.Web 这个古老的部分和 WebForms 一并被删除。今后我们就不再通过 HttpContext 类型访问运行时的各种信息,也不再通过 web.config 文件中的 <system.web> 标签来管理配置项目了。MVC/Web API/SignalR 三个原本独立的框架得以统一为一个开发模型(例如Web API 中的 ApiController 类型现在就和 MVC 的 Controller 类型合二为一)。

在最终应用的部署上,假如 ASP.NET 应用部署在 IIS 和 Windows 上,那么需要额外安装 HttpPlatformHandler。在 Linux 平台上,则首推 nginx 和 Kestrel 搭配的部署方式。

图三:微软的应用迁移路径

由此我们可以看出微软提供的迁移方式有一个从 ASP.NET 4 到 ASP.NET 5 的迁移步骤。这一个看似简单的步骤其实并不简单。代码的迁移和修改暂时还需要很多手工步骤,部署方式的变化要求 Linux 和 nginx 知识的学习,而之前开发者学习多年的 Windows 和 IIS 知识似乎都过时了。

有没有更加简单的方式让 ASP.NET 应用登陆 Linux 平台呢?

Mono 和 Jexus 网站服务器

Mono 这个开源项目其实一直伴随着 .NET Framework 成长。Miguel de Icaza 先生早年一直领导着 Gnome 这个开源桌面系统的开发。在2000年微软公布了 C# 语言和 .NET Framework 之后,他非常感兴趣并且希望能把这些新技术带到 Linux 平台,于是一手建立了 Mono 这个项目和社区。现在 Mono 的稳定版本是 4.2.1,得到了 Xamarin 和微软两家公司的共同支持。

和 .NET Core 5 另起炉灶相比,Mono 处处都保持着和 .NET Framework 的兼容性。在微软去年11月完全基于 MIT 协议开放 .NET Framework 参考代码后,Mono 立即开始集成微软的代码(迄今完成超过600多个类型),非常明显的改善了兼容性。不过 Mono 保持了自己独立开发的 CLR 实现和 C# 编译器,有自己的 AOT 运行环境和 C# Shell。在应用程序框架方面,Mono 提供 WinForms 和 WebForms 支持,也包含了微软早已开源的 MVC 5、Web API 2 和 SignalR 2。

在 Mono 这个稳固的基础之上,中国四川的一位微软 C# MVP 刘冰历时多年设计了一款免费的网站服务器,取名 Jexus,最新稳定版本是5.8.0。比较有意思的是,它基本是用 C# 开发,直接通过 Linux 内核的 epoll 机制来处理网站请求,而不是采用 libuv 之类的封装库,所以提供了高性能保证。作为一款跨平台软件,它支持各种主流 Linux 发布版本和 FreeBSD。

视频一:Ubuntu Server 上安装 Jexus

从架构等技术特点来看,Jexus 也可以媲美 IIS 等商用服务器。比如它提供了多站点支持,拥有应用程序池来调度管理工作进程,具有良好的稳定性和容错能力。又比如它支持 HTTPS 和 WebSockets,支持 FastCGI 协议和 OWIN 标准。它不仅可以作为一款应用服务器,来托管各种 ASP.NET 4 应用(WebForms、MVC、Web API、SignalR),同样也可以作为一般服务器使用,包含 URL 重写、反向代理、压缩传输等基础功能和 SQL 注入预防等多项内置安全防护。

图四:Mono 和 Jexus 提供的简便迁移路径

因为 Jexus 提供了如果便利的迁移方法,所以国内外一些网站已经采用它来作为服务器。在 Jexus 官方网站上有相关的案例可供参考。

视频二:Visual Studio 2013 导出 MVC 5 网站

视频三:Jexus 上架设 MVC 5 网站

Jexus Manager

为了进一步简化 Jexus 的管理,方便熟悉 IIS 的开发者迁移,我在2014-2015这段时间开发了一个可视化的管理工具,名叫 Jexus Manager。

图五:Jexus Manager 用户界面

这是一个可以跨平台运行的程序,支持 Jexus,IIS 和 IIS Express 三种服务器的管理,操作方式完全和微软的 IIS Manager 一致。

从技术细节来看,它也和微软 IIS 高度相似,比如提供了 Microsoft.Web.Administration 和 Microsoft.Web.Management 两个 API 接口,实现配置文件的读写和用户界面的扩展。

Jexus 的未来蓝图

在未来的版本中,Jexus 服务器可能会加入下面的功能:

  • 完美支持 web.config 中的 <system.webServer>
  • 提供 Microsoft.Web.Administration API 给本机其他程序
  • 提供 appcmd 命令行管理工具以达到本机和远程管理
  • 完整的 ASP.NET 5 支持!
  • 提供更多配置选项
  • 提供基于 REST 的远程管理 API
  • 提供网页版的管理工具
  • 可靠的商业技术支持服务

而 Jexus Manager 管理工具则会在2016年分阶段完全开源。

参考

Jexus 网站服务器和 ASP.NET 跨平台开发的更多相关文章

  1. Jexus V5.8.0正式发布:跨平台的ASP.NET WEB服务器

    Jexus Web Server V5.8.0 已于今日(12月10日)正式发布,下载地址:http://www.linuxdot.net/. Jexus v5.8.0有如下的更新: 1,为反向代理增 ...

  2. 为支持ASP.NET5跨平台,Jexus再添新举措

    Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...

  3. Asp.Net跨平台:Ubuntu14.0+Mono+Jexus+Asp.Net

    Asp.Net跨平台的文章园子里有很多,这里给自己搭建的情况做一下总结,方便以后查看. 参考网站:   http://www.linuxdot.net/(Linux DotNET大本营 )  http ...

  4. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  5. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  6. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [中篇]

    我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框 ...

  7. [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  8. [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [中篇]

    我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框 ...

  9. .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存

    .Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...

随机推荐

  1. 《剑指offer》-左旋转字符串

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...

  2. 试安装pyQt5+eric6+python安装

    1.先安装pip最新版 安装之前把sit-packages----pip旧版本删掉 然后再cmd输入pip install --user update pip 2.安装pyqt5 pip instal ...

  3. 域名解析到Nginx服务器项目上

    第一步:先将域名解析到 IP 上 解析完后,如下 第二步:Nginx服务器配置servername 修改 /usr/local/nginx/conf/nginx.conf (你的配置文件可能不在这个目 ...

  4. FastAdmin 的上传代码在哪里?

    FastAdmin 的上传代码在哪里? FastAdmin 默认是通过 Ajax 上传到本地. 使用 admin/ajax/upload 方式返回 url. 代码文件地址在 application\a ...

  5. 【转】一张图解析FastAdmin中的表格列表的功能

     一张图解析FastAdmin中的表格列表的功能 功能描述请根据图片上的数字索引查看对应功能说明. 1.时间筛选器如果想在搜索栏使用时间区间进行搜索,则可以在JS中修改修改字段属性,如 {field: ...

  6. AngularJS表格神器“ui-grid”的应用

    HTML:  (代码仅用于解释得更清楚,并未完全展示) <!doctype html> <html ng-app="app"> <head> & ...

  7. DNS信息收集命令nslookup

    DNS信息收集--NSLOOKUP 前面文章我介绍了dig命令,NSLOOKUP命令用法差不多 简单查询 语法:nslookup domain [dns-server] nslookup www.si ...

  8. Spring Boot 项目实战(一)Maven 多模块项目搭建

    一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...

  9. 前端解读控制反转(IOC)

    前言 随着前端承担的职责越来越重,前端应用向着复杂化.规模化的方向发展.大型项目模块化是一种趋势,不可避免模块之间要相互依赖,此外还有很多第三方包.这样的话如何去管理这些繁杂的文件,是一个不可避免的话 ...

  10. Linux虚拟地址和物理地址的映射

    ➤背景 一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G.用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核 ...