我最近一直在搜索和阅读SignalR,虽然我看到很多关于Hubs和Persistent Connections之间差异的解释但是我还没有能够把我的脑袋放到下一个级别,这是为什么我会选择一种方法而不是另一种呢?
答案 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)
比较这两者时需要考虑三个要点:
对于集线器,消息格式化基本上是由您处理的,但是通过持久连接,消息是原始的,并且已经被标记化并来回解析。如果消息大小很重要,那么还要注意持久连接的有效负载远小于集线器的负载。
对于通信模型,持久连接基本上具有发送和接收消息传递的功能,而集线器采用具有每个要求的唯一功能的remote procedure call模型。
在定制方面,由于持久连接的级别较低,因此可以让您更好地控制自定义。