¿Por qué mi página web pierde la capacidad de recibir mensajes de alerta?

Básicamente tengo 3 aplicaciones. Una aplicación web, Nservicebus y un servidor de autohospedaje Signalr para mis concentradores. Actualmente estoy usando la versión .4 de Signalr. Básicamente, la aplicación web inicia una conexión con el servidor autohospedado al cargar la página. El usuario realiza una acción que envía un comando por el bus de servicio. El bus de servicio luego se conecta al servidor de señales para notificar a todos los clientes web.

Mi página web:

<script src="http://localhost:8081/test/signalr/hubs" type="text/javascript"></script>
<script>
    jQuery.support.cors = true;
    var myHub;  

    $.connection.hub.url = 'http://localhost:8081/test/signalr/hubs';

    $(function () {
        myHub = $.connection.userAccountHub;

        myHub.ChangeNameUpdated = function (connId) {
            alert("recieved signalr message");          
        };

        $.connection.hub.start().done(function() {
            var myClientId = $.connection.hub.id;
            setCookie("srconnectionid", myClientId);
        });
    });

</script>

Mi servidor SignalR:

      static void Main(string[] args)
    {
        Debug.Listeners.Add(new ConsoleTraceListener());
        Debug.AutoFlush = true;

        string url = "http://localhost:8081/test/";
        var server = new Server(url);


        server.EnableHubs();
        server.Start();


        Console.WriteLine("Server running on {0}", url);

        while (true)
        strong text{
            ConsoleKeyInfo ki = Console.ReadKey(true);
            if (ki.Key == ConsoleKey.X)
            {
                break;
            }
        }
    }

Mi Hub dentro de mi proyecto de servidor Signalr

 public class UserAccountHub : Hub
    {

        public void UsersNameChanged(string passedThroughConnectionId)
        {
            Clients.ChangeNameUpdated(passedThroughConnectionId);
        }
    }

Mi llamada desde mi nservicebus

        //connect to signalRServer
        var connection = new HubConnection("http://localhost:8081/test/signalr/hubs");
        IHubProxy myHub = connection.CreateProxy("SignalRServer.Hubs.UserAccountHub");

        //Credentials are inherited from the application
        connection.Credentials = CredentialCache.DefaultNetworkCredentials;

        var test = message.GetHeader("signalrConnectionId");


        connection.Start().Wait();
        myHub.Invoke("UsersNameChanged", message.GetHeader("signalrConnectionId")).ContinueWith(task =>
        {
            //for debuging purposes
            if (task.IsFaulted)
            {
                Console.WriteLine(
                    "An error occurred during the method call {0}",
                    task.Exception.GetBaseException());
            }
            else
            {
                Console.WriteLine("Successfully called MethodOnServer");
            }
        });

Abro 2 navegadores. Inicio el proceso en el segundo navegador, y solo el primero recibe notificaciones. El segundo navegador no.

Tampoco veo ningún problema que se destaque cuando ejecuto fiddler.

¿Hay un mejor enfoque para esta implementación, o me estoy perdiendo algo?

preguntado el 03 de mayo de 12 a las 17:05

¿Algo de eso funciona? var connection = new HubConnection("http://localhost:8081/test/signalr/hubs"); La línea anterior es incorrecta. Crea una conexión a la URL del concentrador de esta manera: var connection = new HubConnection("http://localhost:8081/test/"); Lo mismo para la URL de su centro de javascript, debería ser: $.connection.hub.url = 'localhost:8081/prueba/señal'; -

Funciona "a veces", lo que me hizo pensar que estaba haciendo la parte de conexión correctamente. Si uso solo 1 navegador todo parece funcionar correctamente (la primera vez), si intento hacer una segunda acción, deja de recibir notificaciones. Pero luego, si actualizo la página desde cero, recibirá 1 notificación y luego no recibirá más. Después de ver a Fiddler en un proyecto diferente que tengo, parece que veo una diferencia. Esta solución detiene el sondeo prolongado después de recibir la primera notificación. -

Verificaré usando las conexiones como usted especificó. -

Eso es extraño. Como parece que no debería funcionar en absoluto. -

Gracias David, tus comentarios me llevaron en la dirección correcta. Actualicé a .5 y luego eché un buen vistazo a cómo estaba tratando con las cadenas de conexión. -

1 Respuestas

¡OK! Los comentarios de David me llevaron en la dirección correcta. También noté que esto se actualizó, no lo noté antes. Desplácese hasta la parte inferior para el soporte de dominio cruzado

1.) Actualizado a la versión .5

2.) Modifiqué mi información de conexión en javascript para

$.connection.hub.url = 'http://localhost:8081/test/signalr';

$.connection.hub.start({ transport: 'longPolling', xdomain: true }).done(function () {
    //alert("staring hub connection:  " + $.connection.hub.id);
    setCookie("srconnectionid", $.connection.hub.id);
});

3.) Tuve que cambiar el HubConnection

var connection = new HubConnection("http://localhost:8081/test/");

4.) Tuve que cambiar el IHubProxy

IHubProxy myHub = connection.CreateProxy("UserAccountHub");

contestado el 21 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.