【问题标题】:Is there any way to preserve message order in a SignalR Persistent Connection?有没有办法在 SignalR 持久连接中保留消息顺序?
【发布时间】:2013-07-19 02:33:53
【问题描述】:

情况是 ASP.NET MVC4 项目中 SignalR(来自 NuGet 的 v1.1.2)持久连接上的单个 javascript 客户端。连接后,我会连续从客户端向服务器发送多条消息。在服务器上,我的 OnReceived 覆盖函数同时从多个线程被调用,这导致消息被乱序接收,因为它变成了看哪一个首先击中我的锁的竞赛。从服务器发送到客户端的消息似乎是按顺序传递的,但这可能只是运气。

对于单个客户,是否对消息顺序有任何期望?是否有任何我遗漏的文档列出了持久连接所做的保证?

我是否需要做一些特别的事情来确保服务器到客户端的消息也井然有序?我的大部分发送都是从持久连接外部异步发送的,所以我目前只是调用 IConnection.Send 并忽略返回的任务。

【问题讨论】:

    标签: asp.net signalr persistent-connection


    【解决方案1】:

    快速回答是否定的。当您从服务器向客户端发送消息时,一切都会井然有序。然而,从客户端发送到服务器,将传出客户端到服务器调用排队的唯一传输是 websockets。

    使用持久连接时,您在尝试订购从客户端到服务器的发送时会很不走运,因为无法知道发送何时完成。另一方面,集线器返回一个延迟的(和 C# 中的任务),它允许您等待发送完成,然后再再次发送。

    【讨论】:

    • 您的意思是第二段中的“客户端到服务器”吗?
    • 在从服务器发送消息到客户端时,您确定保留消息顺序吗?见link
    • 消息排序不是保证。我注意到,当使用推送到客户端的背板时,可能会出现乱序。
    • 你在等电话吗?
    • 服务器到客户端也不能保证保持顺序 - 我自己也看到了这种情况。
    最近更新 更多