Pergunta

Estou usando a versão mais recente do SignalR e é ótima.No entanto, recentemente encontrei um problema de escala interessante:parece que o SignalR envia todos os grupos do cliente na string de consulta.Meu sistema exige que uma pessoa participe de vários grupos, que representam todos os projetos nos quais o usuário está inscrito, e receba notificações sobre qualquer um deles.

esse grande número de grupos (e eu usando GUIDs para ids) fez com que a string de consulta atingisse seu tamanho máximo e o SignalR parasse de funcionar.

Isto é o que o Fiddler mostra no formulário web de solicitação (usando pesquisas longas para o bug do 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]

Eu sei que posso aumentar o tamanho da string de consulta no IIS, mas existe uma maneira melhor de gerenciar grupos ou devo tentar criar meu esquema de agrupamento no servidor e transmitir para cada cliente separadamente?o PersistenConnections pode ajudar nesse sentido?

Obrigado.

Foi útil?

Solução

Como os grupos são percorridos por meio da cadeia de consulta no SignalR 0.5.3, você tem as seguintes opções:a) Aumente o tamanho máximo da sequência de consulta b) Use nomes de grupos mais curtos c) manuseie -se agrupando -se no servidor e transmitido separadamente para cada usuário

PersistentConnections não ajudará aqui, pois a API Hub é construída sobre eles, então você encontrará o mesmo problema.

Outras dicas

Sei que isso já foi respondido de forma satisfatória, mas existe uma forma de gerenciar grupos no servidor sem enviar mensagens para cada cliente individualmente.Você pode implementar seu próprio 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);
        }
    }
}

Você pode então configurar o roteamento como qualquer outro 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);
        }
    }
}

Então você pode usar grupos em seus Hubs como faria 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");
        }
    }
}

Se você estiver usando o cliente JS, você pode simplesmente incluir o script em ~/myhubs/hubs em vez de ~/signalr/hubs.Se você estiver usando o cliente .NET, basta usar new Client.Hubs.HubConnection("http://foo/myhubs", useDefaultUrl: false);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top