我最近一直在搜索和阅读 SignalR,虽然我看到很多关于集线器和持久连接之间区别的解释,但我无法理解下一个级别,这就是为什么我要选择一种方法而不是另一种?
5 回答
从我在连接和集线器部分看到的内容看来,集线器提供了一个覆盖较低级别持久连接的主题系统。
从下面高度评价的评论中:
部分正确。您也可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且您想要发送不同类型的有效负载。使用持久连接,您必须将消息类型嵌入到负载中(请参阅原始示例),但集线器使您能够通过连接执行 RPC(允许您从服务器和从服务器到客户端调用客户端上的方法) . 另一件大事是模型绑定。集线器允许您将强类型参数传递给方法。
文档中使用的示例使用了聊天室隐喻,用户可以加入特定的房间,然后只能从同一房间的其他用户那里获取消息。更一般地,您的代码订阅一个主题,然后只获取发布到该主题的消息。通过持久连接,您将获得所有消息。
您可以轻松地在持久连接之上构建自己的主题系统,但在这种情况下,SignalR 团队已经为您完成了这项工作。
主要区别在于您不能使用 PersistentConnection 进行 RPC,您只能发送原始数据。所以不要像这样从服务器发送消息
Clients.All.addNewMessageToPage(name, message);
您必须使用Connection.Broadcast()
or发送一个对象,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发送预序列化的 JSON,而使用集线器则无法做到这一点。在某些情况下,这可能是相关的性能优势。
除此之外,请参阅文档中的此引用:
选择沟通模式
大多数应用程序应该使用 Hubs API。Connections API 可用于以下情况:
需要指定实际发送消息的格式。
开发人员更喜欢使用消息传递和调度模型而不是远程调用模型。
- 正在移植使用消息传递模型的现有应用程序以使用 SignalR。
根据您的消息结构,您还可能从使用 PersistentConnection 中获得小的性能优势。
您可能想查看 SignalR 示例,特别是这里。
有两种使用 SignalR 的方法:您可以通过覆盖其PersistentConnection
类在低级别访问它,这使您可以对其进行大量控制;或者您可以让 SignalR 通过使用高级“集线器”为您完成所有繁重的工作。
Persistent Connection 是一个较低级别的 API,您可以在连接打开或关闭时在更具体的时间执行操作,在大多数应用程序中 Hub 是最佳选择
比较这两者时需要考虑三个主要点:
- 消息格式
- 沟通模式
- SignalR 自定义
使用集线器的消息格式基本上由您处理,但使用持久连接,消息是原始的,并且已经被标记化并来回解析。如果消息大小很重要,那么还要注意持久连接的有效负载远小于集线器的有效负载。
当谈到通信模型时,持久连接基本上具有发送和接收消息的功能,而集线器采用远程过程调用模型,根据要求具有独特的功能。
在定制方面,由于持久连接的级别较低,因此它们可以让您更好地控制定制。