我正在使用 SignalR 的最新版本,它非常棒。然而,我最近遇到了一个有趣的扩展问题:看来 SignalR 在查询字符串中从客户端发送所有客户端组。我的系统要求一个人加入多个组,这些组代表用户订阅的所有项目,并接收有关其中任何项目的通知。

如此大量的组(我使用 GUID 作为 ids)导致查询字符串达到其最大大小,并且 SignalR 停止工作。

这是 Fiddler 在请求 Web 表单中显示的内容(针对 Azure bug 使用长轮询):

transport   longPolling
connectionId    bbed6f35-8379-4be3-ac28-ef3e618382ae
connectionData  [{"name":"jethub"}]
messageId   85
groups  ["JetHub.f9f81bcc-8417-46bd-bae5-c4134972601d","JetHub.5139a8de-04c2-48da-9427-39666e52fabd","JetHub.6b12e333-4d22-47c3-8587-7a9ad5026184","JetHub.252ea279-7a71-40e7-b03c-7d63e69f07ab","JetHub.a4843a77-1e6d-4693-b3de-b392ef465410","JetHub.27feb53a-3c2d-4b11-92f7-dbdffb874b25","JetHub.8840dfcf-e6be-4b72-965b-b282a60446e8","JetHub.bf7d3301-6fc0-4499-bee8-fe22f1bc2281","JetHub.655cba0e-7f72-402c-b80b-dcb740546163","JetHub.85d817e2-67a3-4291-b564-5320598339f6","JetHub.e3079263-3f6e-4a54-ad88-0dfc5dd2ce18","JetHub.33f00a67-9b05-4293-8119-4617e2fed9b0","JetHub.6323cfe8-fb81-4716-b553-79b9d72641a5","JetHub.b4359f8a-030a-4ac9-aacd-c05b42163bcc", ... many more]

我知道我可以增加 IIS 中的查询字符串大小,但是有没有更好的方法来管理组,或者我应该尝试创建服务器端分组方案并分别广播到每个客户端?PersistenConnections 在这方面可以提供帮助吗?

谢谢。

有帮助吗?

解决方案

随着COMATION 0.5.3中的查询字符串循环循环,您可以使用以下选项: a)增加最大查询字符串大小 b)使用较短的组名称 c)处理在服务器上进行分组,并将其单独向每个用户发送

PersistententConnections不会在这里帮助,因为集线器API建立在它们的顶部,因此您将遇到同一问题。

其他提示

我知道这个问题已经得到了令您满意的答复,但是有一种方法可以在服务器上管理组,而无需单独向每个客​​户端发送消息。您可以实现自己的 HubDispatcher:

using System.Collections.Generic;
using SignalR;
using SignalR.Hubs;

namespace My.Hubs
{
    public class MyHubDispatcher : HubDispatcher
    {
        public MyHubDispatcher() : base("/myhubs") { }

        protected override Connection CreateConnection(string connectionId, IEnumerable<string> signals, IEnumerable<string> groups)
        {
            //ex: IEnumerable<string> myGroups = new string[] { "MyHub.MyGroup", "MyHub.MyOtherGroup", "MyOtherHub.MyGroup" };
            IEnumerable<string> myGroups = GetGroups(connectionId);
            return base.CreateConnection(connectionId, signals, myGroups);
        }
    }
}

然后,您可以像任何其他 PersistentConnection 一样设置路由:

using System.Web;
using System.Web.Routing;
using SignalR;

namespace My
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class Application : HttpApplication
    {
        protected void Application_Start()
        {
            RouteTable.Routes.MapConnection<Hubs.MyHubDispatcher>("myhubs", "myhubs/{*operation}");
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

然后您可以像平常一样在 Hub 上使用组:

using SignalR.Hubs;

namespace My.Hubs
{
    public class MyHub : Hub
    {
        public void AlertClients(string id, int duration)
        {
            Clients["MyGroup"].Alert("MyGroup");
            Clients["MyOtherGroup"].Alert("MyOtherGroup");
        }
    }
}

如果您使用 JS 客户端,您只需将脚本包含在 ~/myhubs/hubs 代替 ~/signalr/hubs. 。如果您使用的是 .NET 客户端,则只需使用 new Client.Hubs.HubConnection("http://foo/myhubs", useDefaultUrl: false);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top