SignalR:为什么selectHub与持续连接?

最近我一直在寻找和阅读SignalR,当我看到关于Hub和Persistent Connections之间的区别的很多解释时,我还没有能够把我的头移到下一个层次,这就是为什么我会select另一种方法?

从我在“ 连接和集线器”部分看到的看来,集线器提供了覆盖较低级别持久连接的主题系统。

从下面的高调评论:

部分正确。 您也可以通过持续连接来获取主题或组。 最大的区别是调度不同types的消息。 例如,你有不同types的消息,你想发送不同种类的有效载荷。 使用持续连接,您必须将消息typesembedded到有效负载中(请参阅原始示例),但集线器使您能够通过连接执行RPC(使您可以从服务器和服务器向客户端调用客户端上的方法) 。 另一件大事是模型绑定。 集线器允许您将强typesparameter passing给方法。

文档中使用的示例使用聊天室隐喻,用户可以join特定的房间,然后只能从同一个房间的其他用户收到消息。 更一般地说,您的代码订阅了一个主题,然后只获取发布到该主题的消息。 通过持续的连接,你会得到所有的消息。

您可以轻松地build立自己的持续连接上的话题系统,但在这种情况下,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 }; 

你必须添加一个callback来处理所有传入的消息:

 function addNewMessageToPage(name, message) { // things and stuff } connection.received(function (data) { var method = data.method; window[method](data.name, data.message); }); 

您必须在OnReceived方法中在服务器端执行相同types的调度。 您还必须反序列化数据string,而不是像使用中心方法一样接收强types对象。

selectHubs上的PersistentConnection的原因并不多。 我知道的一个原因是有可能通过PersistentConnection 发送预序列化的JSON ,而你不能使用集线器。 在某些情况下,这可能是相关的性能优势。

除此之外,请参阅文档中的以下引用:

select沟通模式

大多数应用程序应该使用Hubs API。 Connections API可用于以下情况:

  • 发送的实际消息的格式需要指定。

  • 开发人员更喜欢使用消息传递和调度模型,而不是远程调用模型。

  • 使用信息模型的现有应用程序正在移植到使用SignalR。

根据消息结构的不同,使用PersistentConnection可能会带来很小的性能优势。

你可能想看看SignalR的样本,特别是这里。

有两种使用SignalR的方法:你可以通过覆盖它的PersistentConnection类来进行低级访问,这会给你很多的控制权; 或者你可以让SignalR通过使用高层次的“Hubs”来完成所有的繁重工作。

持续连接是一个较低级别的API,当连接打开或closures时,您可以在更具体的时间执行操作,在大多数应用程序中,Hub是最佳select

比较这两个要点需要考虑三点:

  • 消息格式
  • 沟通模式
  • SignalR定制

使用集线器消息格式化基本上是从您处理的,但通过持续连接,消息是原始的,并已被标记和来回parsing。 如果消息大小很重要,那么也要注意持久连接的有效载荷比集线器的有效载荷小得多。

当谈到通信模型时,持久连接基本上具有发送和接收消息的function,而集线器采取具有独特function的远程过程调用模型。

当涉及到定制,因为持续连接更低级别,他们可能会给你更多的自定义控制。