Los clientes son nulos cuando intentan enviar un mensaje a través de Signalr
-
27-10-2019 - |
Pregunta
Tengo el siguiente centro en mi aplicación MVC desde donde me gustaría enviar un mensaje simple al código del lado del cliente:
using SignalR.Hubs;
public class Progress : Hub
{
public void
Send(string message)
{
// Call the addMessage method on all clients
Clients.addMessage(message);
}
public Progress()
{
Clients.addMessage("Starting to analyze image");
}
}
Y el siguiente JavaScript en mi opinión
<script src="/Scripts/jquery.signalR.js" type="text/javascript"></script>
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
// Proxy created on the fly
var connection = $.connection('/signalr/hubs/progress');
// Declare a function on the chat hub so the server can invoke it
connection.addMessage = function (message) {
$('#messages').append('<li>' + message.Content + '</li>');
};
// Start the connection
connection.start();
});
</script>
}
Mi problema es que cuando el código llama al constructor, o el método de envío para el caso, el objeto del cliente es nulo.
Todo se ve bien cuando debuge el código del lado del cliente. El/Signalr/Hubs/Route devuelve el código JavaScript y no hay errores cuando se ejecuta el JavaScript.
Puedo agregar que el código de backend se ejecuta en la parte superior del entorno Umbraco 5 CMS, que no estoy seguro de que esté causando perturbaciones.
¿Alguna sugerencia sobre cómo puedo depurar/resolver esto?
Solución
Parece que está intentando transmitir un mensaje desde el código del lado del servidor instanciando el centro. Lamentablemente no funciona así. Puede ver un ejemplo de cómo enviar mensajes desde el lado del servidor aquí: https://github.com/signalr/signalr/wiki/hubs. Eche un vistazo a la sección "transmitir sobre un centro desde fuera de un centro".
Lo siguiente se utilizaría en el lado del servidor donde desea hacer la transmisión
using SignalR.Infrastructure;
string message = "Test Message";
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
clients.addMessage(message);
Esto coincide con tu Send()
Método Sin embargo, si está intentando configurar un indicador de progreso, probablemente solo desee enviar mensajes a la persona que llama. En este caso, debe actualizar el método de progreso a Caller.addMessage("Starting to analyze image");
. Hacer esto desde fuera del centro es un poco más complicado, ya que deberá realizar un seguimiento de la ID del cliente para la conexión que desea actualizar. Una vez que sepa que lo anterior cambia a:
clients[clientId].addMessage(message);
Otros consejos
Necesitas leer los documentos. Todo en tu muestra se ve mal. Empieza aqui: