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);
});
有没有't many reasons to choose PersistentConnection over Hubs. One reason I' m知道可以通过PersistentConnection send preserialized JSON,你不能使用集线器 . 在某些情况下,这可能是相关的性能优势 .
5 回答
比较这两者时需要考虑三个要点:
消息格式
通讯模型
SignalR自定义
对于集线器,消息格式化基本上是由您处理的,但是通过持久连接,消息是原始的,并且已经被标记化并来回解析 . 如果消息大小很重要,那么还要注意持久连接的有效负载远小于集线器的有效负载 .
对于通信模型,持久连接基本上具有发送和接收消息传递的功能,而集线器采用具有每个要求的唯一功能的remote procedure call模型 .
在定制方面,由于持久连接的级别较低,因此可以让您更好地控制自定义 .
从我在_286208中看到的情况来看,Hubs似乎提供了覆盖较低级别持久连接的主题系统 .
从以下高评价的评论:
文档中使用的示例使用聊天室隐喻,其中用户可以加入特定房间,然后仅从同一房间中的其他用户获取消息 . 更一般地,您的代码订阅主题,然后只获取发布到该主题的消息 . 通过持久连接,您将获得所有消息 .
您可以在持久连接之上轻松构建自己的主题系统,但在这种情况下,SignalR团队已经为您完成了工作 .
有两种方法可以使用SignalR:您可以通过覆盖它的
PersistentConnection
类来以较低的级别访问它,这样可以对它进行大量控制;或者你可以让SignalR通过使用高级别的“集线器”为你完成所有繁重的工作 .Persistent Connection是一个较低级别的API,您可以在打开或关闭连接时在更具体的时间执行操作,在大多数应用程序中,Hub是最佳选择
主要的区别是你不能用PersistentConnection做RPC,你只能发送原始数据 . 所以不要像这样从服务器发送消息
你必须发送一个带有
Connection.Broadcast()
或Connection.Send()
的对象,然后客户端必须决定如何处理它 . 例如,您可以发送如下对象:而在客户端,而不是简单的定义
你必须添加一个回调来处理所有传入的消息:
您必须在
OnReceived
方法中在服务器端执行相同类型的调度 . 您还必须在那里反序列化数据字符串,而不是像使用hub方法那样接收强类型对象 .有没有't many reasons to choose PersistentConnection over Hubs. One reason I' m知道可以通过PersistentConnection send preserialized JSON,你不能使用集线器 . 在某些情况下,这可能是相关的性能优势 .
除此之外,请参阅documentation中的引用:
根据您的消息结构,使用PersistentConnection可能会获得小的性能优势 .
你可能想看看SignalR样本,特别是this here.