SignalR:为什么选择Hub与Persistent Connection?

Cra*_* W. 149 signalr

我最近一直在搜索和阅读SignalR,虽然我看到很多关于Hubs和Persistent Connections之间差异的解释,但是我还没能把我的脑袋放到下一个级别,这就是为什么我会选择一种方法而不是另一种?

Fra*_*len 92

从我在" 连接和集线器"部分中看到的情况看,Hubs似乎提供了覆盖较低级别持久连接的主题系统.

从以下高评价的评论:

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

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

您可以在持久连接之上轻松构建自己的主题系统,但在这种情况下,SignalR团队已经为您完成了工作.

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

Lar*_*ner 64

主要的区别是你不能用PersistentConnection做RPC,你只能发送原始数据.所以不要像这样从服务器发送消息

Clients.All.addNewMessageToPage(name, message);
Run Code Online (Sandbox Code Playgroud)

你必须用Connection.Broadcast()或发送一个对象,Connection.Send()然后客户端必须决定如何处理它.例如,您可以发送如下对象:

Connection.Broadcast(new {
    method: "addNewMessageToPage",
    name: "Albert",
    message: "Hello"
});
Run Code Online (Sandbox Code Playgroud)

而在客户端,而不是简单的定义

yourHub.client.addNewMessageToPage = function(name, message) { 
    // things and stuff
};
Run Code Online (Sandbox Code Playgroud)

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

function addNewMessageToPage(name, message) {
    // things and stuff
}

connection.received(function (data) {
    var method = data.method;

    window[method](data.name, data.message);
});
Run Code Online (Sandbox Code Playgroud)

您必须在OnReceived方法中在服务器端执行相同类型的调度.您还必须在那里反序列化数据字符串,而不是像使用hub方法那样接收强类型对象.

选择PersistentConnection而非Hubs的原因并不多.我知道的一个原因是可以通过PersistentConnection 发送预序列化的JSON,这是使用集线器无法做到的.在某些情况下,这可能是相关的性能优势.

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

选择沟通模式

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

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

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

  • 使用消息传递模型的现有应用程序正在移植以使用SignalR.

根据您的消息结构,使用PersistentConnection可能会获得小的性能优势.

您可能需要查看SignalR示例,特别是此处.


小智 23

有两种方法可以使用SignalR:您可以通过覆盖它的PersistentConnection类来以较低的级别访问它,这可以让您对它进行大量控制; 或者你可以让SignalR通过使用高级别的"集线器"为你完成所有繁重的工作.


xur*_*dev 5

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