SignalR:为什么选择集线器还是永久连接?


150

我最近一直在搜索和阅读SignalR,尽管我对集线器和持久连接之间的区别有很多解释,但我仍无法继续前进,这就是为什么我要这么做选择一种方法而不是另一种方法?

Answers:


92

从“ 连接和集线器”部分中看到的内容来看,集线器似乎提供了一个主题系统,覆盖了较低级别的持久性连接。

从下面的高度评价的评论中:

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

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

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


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

1
好点@davidfowl-我已将您的评论复制到答案中,因为我认为它应该更加突出。
ColinE

63

主要区别在于您无法使用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方法中在服务器端执行相同类型的分派。您还必须在那里反序列化数据字符串,而不是像使用集线器方法那样接收强类型的对象。

没有太多理由选择通过Hubs的PersistentConnection。我知道的一个原因是可以通过PersistentConnection 发送预序列化的JSON,而使用集线器则无法做到。在某些情况下,这可能是相关的性能优势。

除此之外,请参见文档中的引号:

选择沟通模式

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

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

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

  • 使用消息传递模型的现有应用程序将移植为使用SignalR。

根据您的消息结构,使用PersistentConnection也可能会带来一些性能上的好处。

您可能要看一下SignalR样本,特别是这里。


我的一位同事对我说,他选择在集线器上选择PersistentConnection的原因是安全性原因,集线器中是否存在任何安全性问题?
Mehdi Dehghani

24

有两种使用SignalR的方法:您可以通过覆盖其PersistentConnection类在较低级别上对其进行访问,这使您可以对其进行很多控制。或者您可以使用高级“集线器”让SignalR为您完成所有繁重的工作。


5

持久连接是一个较低级别的API,在打开或关闭连接时可以在更特定的时间执行操作,在大多数应用程序中,集线器是最佳选择


4

比较这两者时,需要考虑三个主要方面:

  • 讯息格式
  • 沟通模式
  • SignalR定制

使用集线器,基本上可以由您处理消息格式,但是如果使用持久连接,则消息是原始的,并且已被令牌化和来回解析。如果消息大小很重要,则还请注意,持久连接的有效负载要比集线器的有效负载小得多。

当涉及到通信模型时,持久性连接基本上具有发送和接收消息的功能,而集线器采用的远程过程调用模型具有按要求的独特功能。

在定制方面,由于持久性连接的级别较低,它们可以使您更好地控制定制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.