Jexus 网站服务器和 ASP.NET 跨平台开发
微软的跨平台战略
微软在过去的一年多中时间中发生了令整个 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 之后花了相当长的时间来构架下一代网站开发技术。在这个超过两年的漫长过程中,以下几个目标逐渐清晰,
- 采用新思路来重新设计框架基础。这方面向 node.js 学习不少。
- 采用全新技术,主要是 Roslyn。
- 脱离 .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。
从架构等技术特点来看,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 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 官方网站 http://jexus.org
- Jexus 英文资料 https://jexus.codeplex.com
Jexus 网站服务器和 ASP.NET 跨平台开发的更多相关文章
- Jexus V5.8.0正式发布:跨平台的ASP.NET WEB服务器
Jexus Web Server V5.8.0 已于今日(12月10日)正式发布,下载地址:http://www.linuxdot.net/. Jexus v5.8.0有如下的更新: 1,为反向代理增 ...
- 为支持ASP.NET5跨平台,Jexus再添新举措
Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...
- Asp.Net跨平台:Ubuntu14.0+Mono+Jexus+Asp.Net
Asp.Net跨平台的文章园子里有很多,这里给自己搭建的情况做一下总结,方便以后查看. 参考网站: http://www.linuxdot.net/(Linux DotNET大本营 ) http ...
- 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 ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]
由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [中篇]
我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框 ...
- [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]
由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...
- [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [中篇]
我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框 ...
- .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存
.Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...
随机推荐
- 【C++ Primer 第10章】 10.4.1 插入迭代器
目录 • iostream迭代器 • 反向迭代器 插入迭代器 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 头文件为:#include<iterator it=t 在it指 ...
- C#对Windows文件/文件夹/目录的一些操作总结
1. 在一个目录下创建一个文件夹 if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); ...
- Codeforces Round #441(Div.2) F - High Cry
F - High Cry 题目大意:给你n个数,让你找区间里面所有数或 起来大于区间里面最大数的区间个数. 思路:反向思维,找出不符合的区间然后用总数减去.我们找出每个数掌控的最左端 和最右端,一个数 ...
- Storm通信机制(了解)
Worker间的通信:经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架. Worker进程内部通信:不同worker的thread通信使 ...
- What Are You Talking About HDU1075
一开始我也想用map 但是处理不好其他字符.. 看了题解 多多学习! 很巧妙 就是粗暴的一个字符一个字符的来 分为小写字母和非小写字母两个部分 一但单词结束的时候就开始判断. #includ ...
- 【Java】 剑指offer(53-3) 数组中数值和下标相等的元素
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程 ...
- HDU 2896 病毒侵袭【AC自动机】
<题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...
- Linux遇到的问题
一.基本命令 yum list installed | grep docker 查看yum安装了哪些软件 netstat -lnp|grep 8000 查看端口 netstat -plutn | g ...
- Alpha冲刺随笔五:第五天
课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(十天冲刺) 团队名称:葫芦娃队 作业目标:在十天冲刺里对每天的任务进行总结. 随笔汇总:https://www.cnblogs ...
- SQLite中的SELECT子句使用通配符
SQLite中的SELECT子句使用通配符 在SELECT子句中支持两个通配符,分别为*和table_name.*.其中,*通配符会将FROM子句中每个源表的所有用户定义的列进行输出.例如,下面的SQ ...