首页 文章

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

提问于
浏览
148

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

5 回答

  • 4

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

    • 消息格式

    • 通讯模型

    • SignalR自定义

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

    对于通信模型,持久连接基本上具有发送和接收消息传递的功能,而集线器采用具有每个要求的唯一功能的remote procedure call模型 .

    在定制方面,由于持久连接的级别较低,因此可以让您更好地控制自定义 .

  • 62

    从我在_286208中看到的情况来看,Hubs似乎提供了覆盖较低级别持久连接的主题系统 .

    从以下高评价的评论:

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

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

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

  • 22

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

  • 89

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

  • 5

    主要的区别是你不能用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 方法中在服务器端执行相同类型的调度 . 您还必须在那里反序列化数据字符串,而不是像使用hub方法那样接收强类型对象 .

    有没有't many reasons to choose PersistentConnection over Hubs. One reason I' m知道可以通过PersistentConnection send preserialized JSON,你不能使用集线器 . 在某些情况下,这可能是相关的性能优势 .

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

    选择通信模型大多数应用程序应使用Hubs API . Connections API可用于以下情况:需要指定发送的实际消息的格式 . 开发人员更喜欢使用消息传递和调度模型而不是远程调用模型 . 使用消息传递模型的现有应用程序正在移植以使用SignalR .

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

    你可能想看看SignalR样本,特别是this here.

相关问题