Pregunta

Estoy usando la última versión de SignalR y es genial.Sin embargo, recientemente encontré un problema de escala interesante:parece que SignalR envía todos los grupos del cliente en la cadena de consulta.Mi sistema requiere que una persona se una a numerosos grupos, que representan todos los proyectos a los que está suscrito el usuario, y reciba notificaciones sobre cualquiera de ellos.

Esta gran cantidad de grupos (y yo usando GUID para identificadores) ha provocado que la cadena de consulta alcance su tamaño máximo y SignalR deje de funcionar.

Esto es lo que muestra Fiddler en el formulario web de solicitud (usando un sondeo largo para el error de Azure):

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]

Sé que puedo aumentar el tamaño de la cadena de consulta en IIS, pero ¿existe una mejor manera de administrar grupos o debería intentar crear mi esquema de agrupación del lado del servidor y transmitirlo a cada cliente por separado?¿Puede PersistenConnections ayudar en ese sentido?

Gracias.

¿Fue útil?

Solución

A medida que los grupos están redondeados a través de la cadena de consulta en Signalr 0.5.3, tiene las siguientes opciones: a) Aumente el tamaño máximo de la cadena de consulta b) Use nombres de grupos más cortos c) Manejar agruparse en el servidor y transmitir por separado a cada usuario

Las conexiones persistentes no ayudarán aquí, ya que la API del HUB se basa en la parte superior de ellas, por lo que se encontrará con el mismo problema.

Otros consejos

Sé que esto ya ha sido respondido a tu satisfacción, pero existe una forma de administrar grupos en el servidor sin enviar mensajes a cada cliente individualmente.Puedes implementar tu propio 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);
        }
    }
}

Luego puede configurar el enrutamiento como cualquier otra 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);
        }
    }
}

Luego puedes usar grupos en tus Hubs como lo harías normalmente:

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");
        }
    }
}

Si utiliza el cliente JS, simplemente puede incluir el script en ~/myhubs/hubs en lugar de ~/signalr/hubs.Si está utilizando el cliente .NET, simplemente use new Client.Hubs.HubConnection("http://foo/myhubs", useDefaultUrl: false);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top