ASP.NET 开发人员不必担心 Node 的五大理由 已翻译 100%

yicone 投递于 2014/09/02 17:53 (共 21 段, 翻译完成于 11-12)
阅读 9587
收藏 52
4
加载中

我把我上一篇博文献给了讨论为什么 ASP.NET 开发者需要了解 Node.js 。就像高中辩论赛那样,因为没有任何技术抉择(或者提议)可以凭空存在,我想试试看翻盘,于是我决定从对立面重新想几个 ASP.NET 开发者应该离 Node 远点的理由 (最起码我深思熟虑之后再做决定)。

哦别误会……我真的很喜欢 Node,而且我觉得它提出的概念和模式将在很长一段时间内,对服务端 Web 编程产生深远的影响。即使随着时间的推移 Node 过气了,我们肯定可以从下一个牛逼玩意身上或多或少的感觉到它的影响(不管好的和/或坏的)。而在这期间,我们中很多人都会选择它,幸福的在一起,生产。

开源中国匿名会员
翻译于 2014/09/10 08:39
3

不过条条大路通罗马,虽然现在 Node 可能是"当红炸子鸡",不过这不意味着在Web 服务器上没它不行。每天都有大批的实际有效的产品交货,用那些巨无聊的老框架,比如说 ASP.NET, Java EE, Rails, PHP(!)还有数不清的各种。好吧,甚至还有些疯嘿用 COBOL 搭起了 HTTP 服务! COBOL 的 MVC … diao炸了。我给320个赞(不过千万别让我去干这事)。  Smile

对于在这个行业呆了近二十年有点看破红尘的我来说(摊手),好处就是… Node 提出了一个比较新的有意思的方式来解决那些比较老的无聊的问题。这不是贬低Node。只是说,它不是唯一,昨天不是今天不是明天也不会是。

综上……如果你是个 ASP.NET 程序员然后辞了职找 Node 的工作,来啊!给我发 email 或者 tweet,让我知道你能干啥 (要么干脆直接发简历……我们有在招聘哦!)。不过你如果还很迷茫,纠结于那些 Node-fanboy-love 的反对言论的话……继续读下去。

开源中国匿名会员
翻译于 2014/09/10 09:07
3

1. Node最好的功能(异步I/O)在.NET中已经存在了

对Node最大的论据之一:Node通过使用异步非阻塞模型来处理那些潜在的长时间运行的I/O操作。这意味着大多数在你web应用的服务器端运行的工作(数据库查询、外部请求web service和其他的网络资源、访问文件等等)不会在你处理请求的主线程中发生,可以放心的继续处理其他对本站的HTTP请求。出于这个目的,Node会维护一个线程池,那些工作将被专门调度给一个可用的线程。你可以定义一个回调函数,当其中一个需要长时间运行的操作完成并返回时,Node将为你调用这个函数。这里有一个使用mongoose.js API来查询MongoDB的例子。注意回调函数的参数以及调用‘findOne’时缺乏返回值分配。

var query = Kitten.where({ color: 'white' });


// findOne()唯一的参数是一个当findOne()执行完成后被调用的函数
// 回调函数中包括错误处理以及查询结果(可以为null)的处理

query.findOne(function (err, kitten) {
  if (err) return handleError(err);
  if (kitten) {
    console.log(kitten);
  }
});
LeoG0816
翻译于 2014/09/12 18:21
2

这类“连续传递”的编程风格有的时候对缺乏经验的人来说很难把握,特别是当你的代码嵌套了很多层的时候。 但对于我们熟悉的顺序风格(同步)来说还是有很大优势的:它为你的执行框架提供了一个自然点来做其他事情,而不是(在这个例子里)等待query.findOne()返回 。对Node来说,总有一些别的东西在处理发来的请求。确实, Node最初的设计目的就是因为典型web服务器端的生产瓶颈就是等待I/O的完成。Node的设计正是根据对这一点的观察,提供了很多性能的优势和扩展能力。

这里是对于Node的高级设计的描述:

所以如果你正在用Node,这很棒。不过有趣的是你在今天的ASP.NET中也可以使用相同的模式!可能许多人熟悉最初由C#5.0引入的async和await关键字。在.NET的web应用中使用它们再配合其他辅助框架比如ASP.NET,Entity Framework等同样可以取得像Node一样的非阻塞执行风格。

LeoG0816
翻译于 2014/09/14 00:01
2

这里有一个简单的ASP.NET MVC控制器向Entity Framework进行查询的实现(这个模式换成Web API同样可行):

private DataContext db = new DataContext();

// GET: /Employee/
public async Task<ActionResult> Index()
{
    return View(await db.Employees.ToListAsync());
}

// GET: /Employee/Details/5
public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    Employee employee = await db.Employees.FindAsync(id);

    if (employee == null)
    {
        return HttpNotFound();
    }

    return View(employee);
}

有没有发现每个方法是如何使用async/await来返回Task<ActionResult>而不是ActionResult?这个模式在语义上确保了和Node同样的连续执行风格。await关键字表明了执行暂停的位置(并且当前线程可以先去处理其他请求),此时EF查询在ASP.NET进程外执行。当EF查询返回时,另一个线程用于立即恢复位于'await'后面代码的执行。在ASP.NET中暂停/恢复给了我们如同Node中回调函数般的语义。实现虽然有差异,但基本原理是相同的,宝贵的服务器端资源不能浪费在等待昂贵I/O操作的完成。 

LeoG0816
翻译于 2014/09/14 11:54
2

一个警告:Node的支持者会告诉你Node的优势在于它的设计带领你直接进入“成功的坑”。异步是Node的默认模式,这对于Node来说非常容易,而同时你也可以在像ASP.NET这样的框架中使用异步,许多.NET开发者不这么认为,但这无疑是正确的。 虽然Node应用和ASP.NET应用比起来可能会更加“异步”,但不能理解成自身拥有更好的吞吐量或者更好的扩展性。应用的扩展性并不取决于你使用的框架,而在于你的应用本身是否有良好的扩展性。如果你现在在做APS.NET,在你觉得“ASP.NET缺乏扩展性”之前,花一些时间来学习并应用异步模型 。


2. Node简化的应用模型同样在.NET中可用

另一个Node带来的好处是它简化的编程模型以及自主的步调,你可以了解并选择一些更强大、更复杂的功能并将其引入。要构建一个“真正”的应用,Node需要掌握比ASP.NET更少的概念,这其实并不一定正确,但它确实给人这种感觉。这是主观的理解,但许多Node的初学者认为这是正确的。 

LeoG0816
翻译于 2014/09/14 12:30
2

与之相比,ASP.NET MVC需要一系列连锁的概念:HttpApplication、global.asax、web.config、模型、视图、控制器、路由、行为、束等等。作为一名有经验的ASP.NET开发者,我们认为理所当然 。但想象一下19岁的人准备着手做web开发,给他选择到底是进入奇特的global.asax和web.config还是简单地查找几行Javascript,Node会受到青睐并不奇怪。每一代人都会无意识地带着自豪进行挖掘:“昨天我们用一个马拉的犁和一个干草叉,以及一些进取心,架设了HTTP服务,我们喜欢它!” 并且每一代人都有另外一代的年轻人紧随其后,转着它们的眼睛然后向前进,使用新的工具和技术。 

LeoG0816
翻译于 2014/09/14 12:48
2

额...但是再一次我们看到ASP.NET学到了一些新招数和进步。在近几年,微软致力于对.NET开发者社区定义的OWIN(.NET的开放Web接口)规范的限制。 它的基本思想是从服务器端的基础设施对.NET的web应用解耦,为.NET的web桟(主机,服务器,中间件和应用)定义一个正式的抽象层,同时也定义了相邻层之间交互的接口,这增进了多个web主机间的可移植性。它同时也作为Katana项目的基础,Katana项目是微软对OWIN的实现,旨在通过传统的ASP.NET管道、HttpListener、IIS、主机以及其他更多东西来处理HTTP请求。

OWIN和Katana借鉴了Node和其他许多轻量级框架,所以编程模型简单亲切。记得在Node里"hello world"有多简单吗?看看Katana:

public class Startup
{
   public void Configuration(IAppBuilder app)
   {
      app.Run(context =>
      {
         context.Response.ContentType = "text/plain";
         return context.Response.WriteAsync("Hello World!");
      });
   }
}
LeoG0816
翻译于 2014/09/14 13:40
2

很容易吧!为任何给定的终结点简单定义行为(上面的代码使用的简单行为为这个应用的所有终结点所共用)。注意代码默认是异步的,就像Node一样。谁说老狗不能学新招数!

明确地讲,上面的代码在任何Katana主机上都可以运行:IIS,OWIN.exe(一个微软提供的控制台host,类似于node.exe),或是你自定义的host实现。可以在多台主机和服务器端运行同样的代码是Katana非常有用的功能,而Node没有提供。

等等,还有!Katana有一个在常用IIS+ASP.NET服务器基础设施中的弱点,它依赖于System.Web,它不仅包括ASP.NET管道中的类型(HttpApplication,HttpContext,IHttpModule,IHttpHandler等),它还包括一些Web Forms的编程模型(pages,contorls,view state等)。你真的想把这些都带到你现代的轻量级Katana应用程序域中?是的,ASP.NET团队不认为你会使用其中任何一个。 

LeoG0816
翻译于 2014/09/14 14:11
2

所以他们创建了Helios项目。Helios是一个雏形项目,旨在具体化使用IIS(利用IIS的安全性、缓存、进程生命周期管理等)host的OWIN应用不需要将System.Web拖入你的应用程序域。 Helios是一个pre-alpha版本,所以我们需要小心比较。然而,相比ASP.NET host的应用,Helios确实证明可以明显减少请求钱的内存消耗,它预示了.NET的web桟在未来将更加简洁,更具扩展性。这对于ASP.NET开发者而言是好事,你可以现在着手研究OWIN和Katana。最终,让ASP.NET团队知道你需要一个官方完整支持、类似于Helios的应用桟!


3. Node的"到处都是Javascript"很棒!除非它不是 

Node的其中一个论据是在你整个应用桟中你可以只使用Javascript。这确实有很多优势。 

LeoG0816
翻译于 2014/09/14 14:34
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(35)

1071954237
1071954237

引用来自“sikele”的评论

nodejs还在等async await的时候,C#用了好多年了,nodejs的异步,效率,框架,都被C#完爆不已。
c#新手,在之前的项目中使用异步编程遇到一些坑,不过很快解决了。总的来说微软为开发者准备了很多成熟的解决方案。而且现在.net core开源,并且能够部署到linux上,降低了初创公司的开发成本,毕竟国内公司喜欢使用免费的
crossmix
crossmix
ok
开源中国首席男司机
开源中国首席男司机
PHP是世界上最好的语言,没有之一
大合集
大合集
明天 ASP.NET 开发人员不必担心 Java 的五大理由
后天 ASP.NET 开发人员不必担心 PHP 的五大理由
kzwr
kzwr
toozyxia
toozyxia

引用来自“吐槽的达达仔”的评论

在开源OSC看到.NET。。。我笑了。。
你难道没听到风声,.net开源了,ide有免费版了。
皮蛋爸
皮蛋爸
.net 开源了..
大王叫我来卖萌
大王叫我来卖萌

引用来自“hefju”的评论

asp.net要放在iis才能运行啊, nodejs就简单多了
现在支持self-host,该更新你的知识库了
乌龟壳
乌龟壳

引用来自“eechen”的评论

不会吗,DotNet已经沦落到接基于Google V8的开源项目Node.js来宣传了吗?太搞笑了!Java EE、PHP LAMP、Node.js、RoR、Python(Django)等,这些能够良好运行在Linux等多个平台上的开源选项很多,为什么要选萎软的DotNet,靠边站吧,呵呵。人傻钱多的人才会去舔萎软。
五分钟让新手做一个录入界面出来,包括数据库连接池、防跨域、防破解、并能在后端存储会话,可以跑集群。谢谢!
sikele
sikele

引用来自“hefju”的评论

asp.net要放在iis才能运行啊, nodejs就简单多了
server.exe 单文件iis,windows自带iis也很容易,路径搞进去就行了。
返回顶部
顶部