SignalR:为什么选择Hub与Persistent Connection?

时间:2012-02-14 16:27:30

标签: signalr

我最近一直在搜索和阅读SignalR,虽然我看到很多关于Hubs和Persistent Connections之间差异的解释但是我还没有能够把我的脑袋放到下一个级别,这是为什么我会选择一种方法而不是另一种呢?

5 个答案:

答案 0 :(得分:90)

从我在Connection and Hubs section中看到的情况看,Hubs似乎提供了一个覆盖较低级别持久连接的主题系统。

来自以下高评价的评论:

  

部分正确。您也可以在持久连接中获取主题或组。最大的区别是调度不同类型的消息。例如,您有不同类型的消息,并且您希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参阅Raw示例),但集线器使您能够通过连接执行RPC(允许您从服务器和服务器到客户端调用客户端上的方法) 。另一件大事是模型绑定。集线器允许您将强类型参数传递给方法。

文档中使用的示例使用聊天室隐喻,用户可以加入特定的房间,然后只能从同一房间的其他用户那里获取消息。更通用的是,您的代码订阅了一个主题,然后只获得发布到该主题的消息。通过持久连接,您将获得所有消息。

您可以在持久连接之上轻松构建自己的主题系统,但在这种情况下,SignalR团队已经为您完成了工作。

答案 1 :(得分:62)

主要区别在于您无法使用PersistentConnection执行RPC,您只能发送原始数据。所以不要像这样从服务器发送消息

Clients.All.addNewMessageToPage(name, message);

您必须使用Connection.Broadcast()Connection.Send()发送对象,然后客户端必须决定如何处理该对象。例如,您可以发送如下对象:

Connection.Broadcast(new {
    method: "addNewMessageToPage",
    name: "Albert",
    message: "Hello"
});

在客户端上,而不是简单地定义

yourHub.client.addNewMessageToPage = function(name, message) { 
    // things and stuff
};

您必须添加回调才能处理所有传入的消息:

function addNewMessageToPage(name, message) {
    // things and stuff
}

connection.received(function (data) {
    var method = data.method;

    window[method](data.name, data.message);
});

您必须在OnReceived方法中在服务器端执行相同类型的调度。您还必须在那里反序列化数据字符串,而不是像使用集线器方法那样接收强类型对象。

选择PersistentConnection而不是Hubs的原因并不多。我之所知的一个原因是,可以通过PersistentConnection send preserialized JSON进行documentation,这是您无法使用集线器进行的。在某些情况下,这可能是相关的性能优势。

除此之外,请参阅this here.

中的这句话
  

选择沟通模式

     

大多数应用程序都应使用Hubs API。 Connections API可以   用于以下情况:

     
      
  • 需要指定发送的实际消息的格式。

  •   
  • 开发人员更喜欢使用消息传递和调度模型   而不是远程调用模型。

  •   
  • 正在移植使用消息传递模型的现有应用程序以使用SignalR。
  •   

根据您的消息结构,使用PersistentConnection可能会获得很小的性能优势。

您可能需要查看SignalR示例,特别是{{3}}

答案 2 :(得分:22)

使用SignalR有两种方法:你可以通过覆盖它的PersistentConnection类来低级访问它,这样你可以对它进行大量的控制;或者你可以通过使用高级别的“集线器”让SignalR为你完成所有繁重的任务。

答案 3 :(得分:5)

Persistent Connection是一个较低级别的API,您可以在打开或关闭连接时在更具体的时间执行操作,在大多数应用程序中,Hub是最佳选择

答案 4 :(得分:4)

比较这两者时需要考虑三个要点:

  • 邮件格式
  • 沟通模式
  • SignalR customization

对于集线器,消息格式化基本上是由您处理的,但是通过持久连接,消息是原始的,并且已经被标记化并来回解析。如果消息大小很重要,那么还要注意持久连接的有效负载远小于集线器的负载。

对于通信模型,持久连接基本上具有发送和接收消息传递的功能,而集线器采用具有每个要求的唯一功能的remote procedure call模型。

在定制方面,由于持久连接的级别较低,因此可以让您更好地控制自定义。