除非你是多年生活在石器时代,否则你不会没听说过 Node.js,一套用来编写高性能网络服务器的JavaScript平台。如果你跟我一样是一个 .NET 工程师,主要开发 Windows 下的各种应用,那么在听到 Node.js 介绍时你的反应可能是:哦,这不错,然后继续工作。但我想说的是,现在是时候用 Node.js 来开发应用了,它可以简化很多现有工具所作的工作,而且 Node.js 在 Windows 下也已经足够成熟。一个很好的例子就是 iisnode ,可以直接在 IIS 上运行 Node.js 应用。我们来写一个小例子,我需要编写一个小的 Web 服务,只是简单的在响应之前等待一秒钟。我同时想测试一下 EasyNetQ 的异步 IO 处理。我之前的测试是用 .NET 开发的,下面是我实现的 IHttpHandler 代码:
02 | using System.Threading; |
03 | using System.Threading.Tasks; |
06 | namespace TestHttpHandler |
08 | public class TimerHandler : IHttpAsyncHandler |
10 | public void ProcessRequest(HttpContext context) |
12 | throw new InvalidOperationException("This handler cannot be called synchronously"); |
15 | public bool IsReusable |
20 | public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback callback, object state) |
22 | var taskCompletionSouce = new TaskCompletionSource<bool>(state); |
23 | var task = taskCompletionSouce.Task; |
25 | var timer = new Timer(timerState => |
27 | context.Response.Write("OK"); |
29 | taskCompletionSouce.SetResult(true); |
31 | timer.Change(1000, Timeout.Infinite); |
36 | public void EndProcessRequest(IAsyncResult result) |
你看出来了,写一个非堵塞的服务器挺不容易的,你必须仔细处理 TPL 和 APM,这对很多中级 .NET 开发者来说都已经挺难的了。为了运行上述代码,我还必须在 IIS 中设置一个新的 Web 应用,并配置 Web.config 文件,尽管事情不算太多,但已经让我厌倦。那么用 Node.js 该怎么写上述的服务呢?
01 | var http = require("http"); |
03 | http.createServer(function (req, res) { |
04 | setTimeout(function () { |
05 | res.writeHead(200, { "Content-Type": "text/plain" }); |
10 | console.log("LongRunningServer is at http://localhost:1338/"); |
首先,代码明显减少很多,Node 本身是异步的,你无需理解 JavaScript 在处理异步IO方面的任何术语,编写你的服务就是了。尽管我自己是个 Node 的初学者,但我已经可以很快速的编写上面的例子,而且要运行上面的代码也非常的简单,在装好 Node 后只需要打开命令行窗口,执行如下命令即可:
1 | node LongRunningServer.js |
我还没有想过要放弃 .NET ,但我想,是时候考虑在我的 .NET 应用中采用 Node 来做点事情了。更多关于Node.js的详细信息,或者下载地址请点这里