Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Signalr 信号员:为什么选择集线器而不是持久连接?_Signalr - Fatal编程技术网

Signalr 信号员:为什么选择集线器而不是持久连接?

Signalr 信号员:为什么选择集线器而不是持久连接?,signalr,Signalr,我最近一直在搜索和阅读SignalR,虽然我看到了很多关于集线器和持久连接之间区别的解释,但我一直无法了解下一个层次,这就是为什么我会选择一种方法而不是另一种方法?从我在中看到的情况来看,集线器似乎提供了一个覆盖较低级别持久连接的主题系统 下面是投票率较高的评论: 部分正确。您还可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参见原始示例),但集线器使您能够通过连接执行RPC

我最近一直在搜索和阅读SignalR,虽然我看到了很多关于集线器和持久连接之间区别的解释,但我一直无法了解下一个层次,这就是为什么我会选择一种方法而不是另一种方法?

从我在中看到的情况来看,集线器似乎提供了一个覆盖较低级别持久连接的主题系统

下面是投票率较高的评论:


部分正确。您还可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参见原始示例),但集线器使您能够通过连接执行RPC(允许您在客户端上从服务器和从服务器到客户端调用方法)。另一件大事是模型绑定。集线器允许您将强类型参数传递给方法

文档中使用的示例使用聊天室隐喻,用户可以加入特定的聊天室,然后仅从同一聊天室中的其他用户处获取消息。更一般地说,您的代码订阅一个主题,然后只获取发布到该主题的消息。通过持久连接,您将获得所有消息


您可以轻松地在持久性连接的基础上构建自己的主题系统,但在本例中,Signal团队已经为您完成了这项工作。

使用Signal有两种方法:您可以通过重写其
持久性连接
类在较低级别访问它,这使您可以对它进行大量控制;或者,您可以使用高级“集线器”让SignalR为您完成所有繁重的工作。

持久连接是一种较低级别的API,您可以在连接打开或关闭时在更特定的时间执行操作,在大多数应用程序中,集线器是最佳选择

主要区别在于不能使用PersistentConnection执行RPC,只能发送原始数据。因此,与其像这样从服务器发送消息

Clients.All.addNewMessageToPage(名称、消息);
您必须使用
Connection.Broadcast()
Connection.send()
发送对象,然后客户端必须决定如何处理该对象。例如,您可以发送如下对象:

Connection.Broadcast(新){
方法:“addNewMessageToPage”,
姓名:“阿尔伯特”,
留言:“你好”
});
在客户机上,而不是简单地定义

yourHub.client.addNewMessageToPage=函数(名称,消息){
//东西
};
您必须添加回调来处理所有传入消息:

函数addNewMessageToPage(名称、消息){
//东西
}
已接收连接(功能(数据){
var方法=data.method;
窗口[方法](data.name,data.message);
});
您必须在服务器端使用
OnReceived
方法执行相同类型的分派。您还必须在那里反序列化数据字符串,而不是像使用hub方法那样接收强类型对象

选择PersistentConnection而不是集线器的原因不多。我知道的一个原因是,可以通过PersistentConnection进行连接,这是使用集线器无法做到的。在某些情况下,这可能是一个相关的性能优势

除此之外,请参见以下引用:

选择沟通模式

大多数应用程序都应该使用集线器API。连接API可以 可在以下情况下使用:

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

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

  • 正在将使用消息传递模型的现有应用程序移植为使用Signal
根据您的消息结构,您还可能从使用PersistentConnection中获得较小的性能优势


你可能想看看信号样本,特别是

当比较这两个时,有三个要点需要考虑:

  • 消息格式
  • 传播模式
  • 信号员定制
对于集线器,消息格式基本上是由您处理的,但是对于持久连接,消息是原始的,并且已经被标记化并来回解析。如果消息大小很重要,那么还要注意,持久连接的有效负载远小于集线器的有效负载

就通信模型而言,持久连接基本上具有发送和接收消息的功能,而集线器则采用根据需求具有独特功能的模型


在定制方面,由于持久性连接的级别较低,因此它们可以让您更好地控制定制。

部分正确。您还可以在持久连接中获取主题或组。最大的区别在于发送不同类型的消息。例如,您有不同类型的消息,并且希望发送不同类型的有效负载。对于持久连接,您必须在有效负载中嵌入消息类型(请参见原始示例),但集线器使您能够通过连接执行RPC(允许您在客户端上从服务器和从服务器到客户端调用方法)。另一件大事是模型绑定。集线器允许您将强类型参数传递给方法。要点很好@davidfoll-我已将您的评论复制到答案中,因为我认为它应该更突出。我的一位同事对我说,他选择PersistentConnection而不是集线器的原因是安全原因,集线器中是否存在安全问题或其他问题?