Clients ist null, wenn Sie versuchen, eine Nachricht per SignalR zu senden
-
27-10-2019 - |
Frage
Ich habe den folgenden Hub in meiner MVC -Anwendung, von wo aus ich eine einfache Nachricht an meinen Client -Seitencode senden möchte:
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");
}
}
Und das folgende JavaScript aus meiner Ansicht
<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>
}
Mein Problem ist, wenn der Code den Konstruktor oder die Send -Methode aufruft, ist das Client -Objekt null.
Alles sieht gut aus, wenn ich den Client -Seitencode debugge. Der/SignalR/Hubs/Route gibt JavaScript -Code zurück und es gibt keine Fehler, wenn das JavaScript ausgeführt wird.
Ich kann hinzufügen, dass der Backend -Code über der Umgebungsumgebung umbraco 5 CMS läuft, von der ich nicht sicher bin, dass sie Störungen verursacht.
Irgendwelche Vorschläge, wie ich das debuggen/lösen kann?
Lösung
Es hört sich so an, als würden Sie versuchen, eine Nachricht vom Server -Seitencode zu übertragen, indem Sie den Hub instanziieren. Leider funktioniert es nicht so. Sie können ein Beispiel dafür sehen, wie Sie hier Nachrichten von der Serverseite senden: https://github.com/signalr/signalr/wiki/hubs. Schauen Sie sich den Abschnitt "Übertragung über einen Hub außerhalb eines Hubs" an.
Das Folgende wird auf der Serverseite verwendet, auf der Sie die Sendung ausführen möchten
using SignalR.Infrastructure;
string message = "Test Message";
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
clients.addMessage(message);
Dies passt zu Ihrem Send()
Methode, wenn Sie jedoch versuchen, einen Fortschrittsanzeige -Indikator einzurichten, möchten Sie wahrscheinlich nur Nachrichten an den Anrufer senden. In diesem Fall müssen Sie die Fortschrittsmethode aktualisieren Caller.addMessage("Starting to analyze image");
. Um dies von außerhalb des Hubs zu tun, ist etwas schwieriger, da Sie die Client -ID für die Verbindung, die Sie aktualisieren möchten, im Auge behalten müssen. Sobald Sie wissen, dass sich die oben genannten ändert::
clients[clientId].addMessage(message);
Andere Tipps
Sie müssen die Dokumente lesen. Alles in Ihrem Beispiel sieht falsch aus. Fang hier an: