微软的跨平台战略

微软在过去的一年多中时间中发生了令整个 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. 二.hadoop环境搭建

    目录: 目录见文章1 文章:官方文档hadoop2.7.4 目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS)和Map-Reduce框架有 ...

  2. jeecg Export导出图片到excel

    import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  3. 【深度探索C++对象模型 | 02】构造函数语意学

    默认构造函数的构造操作.拷贝构造函数额构造操作  注意:默认构造函数和拷贝构造函数在必要时的时候由编译器产生出来. 参考资料 关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数)

  4. 【AtCoder】ARC078

    C - Splitting Pile 枚举从哪里开始分的即可 #include <bits/stdc++.h> #define fi first #define se second #de ...

  5. python全栈开发day31-操作系统介绍,异步、同步、阻塞、非阻塞,进程

    一.网络编程内容回顾 1.arp协议 #交换机 #广播.单播 2.ip协议 3.tcp和udp协议 tcp:可靠的,面向连接的,字节流传输,长连接 三次握手:一方发送请求,另一方确认请求同时发送请求, ...

  6. 一次流式处理的submit

    考虑很多: 压背.限流.JVM优化,出错的重试等 #!/bin/bash num_executors=1 executor_memory=1g driver_memory=1g executor_co ...

  7. Kubernetes学习系列

    这段时间项目组内想要引入Kubernetes,作为第二代容器调度引擎,故最近在系统的学习Kubernetes.整理了一些学习笔记,心得,放到博客中,一来记录自己的学习经过,二来看能否帮到有需要的同学. ...

  8. 连连看 (BFS)

    难点在于判断转弯小于两次  这个还好 主要是   走过的路还能再走 但是去掉标记数组会超时 *******所以用     v.step<=f[v.x][v.y]即可!!!  这个思想非常重用!! ...

  9. unity 之 no cameras rendering

    相机被隐藏或删除了 应该是你的代码摧毁了全部的东西,包括摄像机,所以就会提示你没有摄像机了. 或者说你将  OnClose(); 这段代码的脚本赋给了摄像机

  10. bfs-poj3278

    题目链接:http://poj.org/problem?id=3278 题意:农夫原始在N位置上,他的目的是要抓到在K位置上的牛.牛的位置是固定不变的,而农夫的移动是在一条水平线上进行的,移动方式有以 ...