Answers:
从“ 连接和集线器”部分中看到的内容来看,集线器似乎提供了一个主题系统,覆盖了较低级别的持久性连接。
从下面的高度评价的评论中:
部分正确。您还可以在持久连接中获取主题或组。最大的区别是调度不同类型的消息。例如,您有不同类型的消息,并且想要发送不同类型的有效负载。对于持久连接,您必须将消息类型嵌入有效负载中(请参阅原始示例),但是集线器使您能够通过连接执行RPC(让您在服务器上以及从服务器到客户端的客户端上调用方法) 。另一个大问题是模型绑定。集线器允许您将强类型参数传递给方法。
文档中使用的示例使用了一个聊天室隐喻,用户可以加入特定的聊天室,然后仅从同一聊天室中的其他用户那里收到消息。通常,您的代码订阅一个主题,然后仅获取发布到该主题的消息。使用持久连接,您将收到所有消息。
您可以在持久连接之上轻松构建自己的主题系统,但是在这种情况下,SignalR团队已经为您完成了工作。
主要区别在于您无法使用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样本,特别是这里。
有两种使用SignalR的方法:您可以通过覆盖其PersistentConnection
类在较低级别上对其进行访问,这使您可以对其进行很多控制。或者您可以使用高级“集线器”让SignalR为您完成所有繁重的工作。
比较这两者时,需要考虑三个主要方面:
使用集线器,基本上可以由您处理消息格式,但是如果使用持久连接,则消息是原始的,并且已被令牌化和来回解析。如果消息大小很重要,则还请注意,持久连接的有效负载要比集线器的有效负载小得多。
当涉及到通信模型时,持久性连接基本上具有发送和接收消息的功能,而集线器采用的远程过程调用模型具有按要求的独特功能。
在定制方面,由于持久性连接的级别较低,它们可以使您更好地控制定制。