Signalr 信号员:为什么选择集线器而不是持久连接?
我最近一直在搜索和阅读SignalR,虽然我看到了很多关于集线器和持久连接之间区别的解释,但我一直无法了解下一个层次,这就是为什么我会选择一种方法而不是另一种方法?从我在中看到的情况来看,集线器似乎提供了一个覆盖较低级别持久连接的主题系统 下面是投票率较高的评论:Signalr 信号员:为什么选择集线器而不是持久连接?,signalr,Signalr,我最近一直在搜索和阅读SignalR,虽然我看到了很多关于集线器和持久连接之间区别的解释,但我一直无法了解下一个层次,这就是为什么我会选择一种方法而不是另一种方法?从我在中看到的情况来看,集线器似乎提供了一个覆盖较低级别持久连接的主题系统 下面是投票率较高的评论: 部分正确。您还可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参见原始示例),但集线器使您能够通过连接执行RPC
部分正确。您还可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参见原始示例),但集线器使您能够通过连接执行RPC(允许您在客户端上从服务器和从服务器到客户端调用方法)。另一件大事是模型绑定。集线器允许您将强类型参数传递给方法 文档中使用的示例使用聊天室隐喻,用户可以加入特定的聊天室,然后仅从同一聊天室中的其他用户处获取消息。更一般地说,您的代码订阅一个主题,然后只获取发布到该主题的消息。通过持久连接,您将获得所有消息
您可以轻松地在持久性连接的基础上构建自己的主题系统,但在本例中,Signal团队已经为您完成了这项工作。使用Signal有两种方法:您可以通过重写其
持久性连接
类在较低级别访问它,这使您可以对它进行大量控制;或者,您可以使用高级“集线器”让SignalR为您完成所有繁重的工作。持久连接是一种较低级别的API,您可以在连接打开或关闭时在更特定的时间执行操作,在大多数应用程序中,集线器是最佳选择主要区别在于不能使用PersistentConnection执行RPC,只能发送原始数据。因此,与其像这样从服务器发送消息
Clients.All.addNewMessageToPage(名称、消息);
您必须使用Connection.Broadcast()
或Connection.send()
发送对象,然后客户端必须决定如何处理该对象。例如,您可以发送如下对象:
Connection.Broadcast(新){
方法:“addNewMessageToPage”,
姓名:“阿尔伯特”,
留言:“你好”
});
在客户机上,而不是简单地定义
yourHub.client.addNewMessageToPage=函数(名称,消息){
//东西
};
您必须添加回调来处理所有传入消息:
函数addNewMessageToPage(名称、消息){
//东西
}
已接收连接(功能(数据){
var方法=data.method;
窗口[方法](data.name,data.message);
});
您必须在服务器端使用OnReceived
方法执行相同类型的分派。您还必须在那里反序列化数据字符串,而不是像使用hub方法那样接收强类型对象
选择PersistentConnection而不是集线器的原因不多。我知道的一个原因是,可以通过PersistentConnection进行连接,这是使用集线器无法做到的。在某些情况下,这可能是一个相关的性能优势
除此之外,请参见以下引用:
选择沟通模式
大多数应用程序都应该使用集线器API。连接API可以
可在以下情况下使用:
- 需要指定实际发送的消息的格式
- 开发人员更喜欢使用消息传递和调度模型 而不是远程调用模型
- 正在将使用消息传递模型的现有应用程序移植为使用Signal
你可能想看看信号样本,特别是
当比较这两个时,有三个要点需要考虑:
- 消息格式
- 传播模式
- 信号员定制
在定制方面,由于持久性连接的级别较低,因此它们可以让您更好地控制定制。部分正确。您还可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参见原始示例),但集线器使您能够通过连接执行RPC(允许您在客户端上从服务器和从服务器到客户端调用方法)。另一件大事是模型绑定。集线器允许您将强类型参数传递给方法。要点很好@davidfoll-我已将您的评论复制到答案中,因为我认为它应该更突出。我的一位同事对我说,他选择PersistentConnection而不是集线器的原因是安全原因,集线器中是否存在安全问题或其他问题?