¿Por qué mi página web pierde la capacidad de recibir mensajes de alerta?
Frecuentes
Visto 3,104 veces
3
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?
1 Respuestas
2
¡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 signalr or haz tu propia pregunta.
¿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'; - davidfowlFunciona "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. - Etch
Verificaré usando las conexiones como usted especificó. - Etch
Eso es extraño. Como parece que no debería funcionar en absoluto. - davidfowl
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. - Etch