4

在用 asp .net MVC 编写的基于 javascript 的数据驱动应用程序中,使用 Signalr 作为通信方法有哪些优点和缺点?

谢谢,

4

1 回答 1

6

当然,你不应该使用 SignalR,除非你需要它提供的东西,也就是说,一个简单的、专注于 JavaScript 客户端的双工 Web 服务层。如果您是 ASP.NET 的新手,那么这可能不是您马上需要的——在您开始编写复杂的、数据驱动的 JavaScript 应用程序之前,您需要学习很多其他东西. 如果您只打算使用 .NET 客户端,请坚持使用 WCF:它更灵活,并且它的静态类型更适合 C# 和 VB.NET。

也就是说,当您确实需要为 JavaScript 应用程序提供基于 .NET 的 Web 服务后端时,SignalR 是一个不错的选择。它的配置肯定比 Windows Communication Foundation 更简单,而且对于 JavaScript 应用程序,它具有一组更好的功能。它似乎是由 Microsoft 赞助的(他们允许它位于 Microsoft.AspNet 命名空间中),并且负责它的人似乎很聪明并且非常努力工作(如果有时有点尖刻)。我曾经在午夜报告了一个错误,在 15 分钟内得到了响应,并在我早上起床时修复。当然,它是开源的,而且他们愿意考虑拉取请求,所以如果你需要修复一些东西,你会比微软以前的闭源模型有更好的运气。

它唯一真正的缺点是它非常新——它最近达到了 1.0 RC1 状态——因此缺少一些很好的功能,并且仍然有一些错误(当然,这些最终会得到修复)。

这是一个仍然有点新的例子。如果您尝试序列化复杂的对象图,您几乎肯定会遇到的一个问题是它使用 Json.NET 的专有格式进行对象引用,因此您最终会得到很多如下所示的 JSON:

{
  "$id": "57",
  "Name": "_default",
  "User": {
      "$id": "58",
      "UserTag": "ken",
      "Sessions": [{
          "$id": "59",
          "SessionId": "0ca7474e-273c-4eb2-a0c1-1eba2f1a711c",
          "User": {
              "$ref": "58"
          },
          "Room": {
              "$ref": "57"
          }
      }],
  },

  "Sessions": [{
      "$ref": "59"
  }]
}

Session[]读取数组并发现其中唯一的对象根本不是 aSession而是具有单个$ref属性的任意对象并不是很有帮助。为了解决这个问题,您需要使用 JsonNetDecycle 之类的东西来包装所有 SignalR调用。不难,但在 SignalR 本身中处理会很好。(当然,如果我是一个更好的人,我会自己编写代码并将其作为拉取请求提交 - 只是还没有解决。)

于 2012-12-31T19:38:42.890 回答