Ich werde versuchen, eine lange Geschichte kurz zu machen:
Ich möchte eine Methode auf einem Hub in einer Webanwendung von einer Core Assembly in meiner Anwendung aufrufen. Der Grund dafür ist, dass ich eine Reihe von Anwendungen, die alle schließlich in Kern aufrufen und Ereignisse auslösen (denken Sie mobile Web, Admin-Site, api, etc.) haben. Ich möchte die Benutzer der Desktop-Site von Ereignissen benachrichtigen, wie sie geschehen, mit SignalR.
Um dies aufzuspüren, habe ich eine 4-Projekt-Lösung entwickelt. Ein Kernprojekt mit dem Hub-Proxy. Eine Webanwendung mit dem Hub. Eine weitere Webanwendung ohne den Hub. Und schließlich eine Konsolenanwendung.
Wenn ich Core von der Konsolenanwendung aus aufrufe und versuche, über den Proxy eine Nachricht an Hub-Clients zu senden, funktioniert alles bestens. Wenn ich jedoch versuche, Core aufzurufen und den Proxy von einer der Webanwendungen aus zu verwenden, bleibt die Ausführung beim Aufruf von connection.Start() hängen:
var connection = new HubConnection("...");
var hub = connection.CreateProxy("Spike.Hub");
connection.Start().Wait();
Ist der SignalR.Client nicht dafür gedacht, innerhalb der App-Domäne einer Web-App verwendet zu werden? Warum funktioniert es wie erwartet in der Konsolenanwendung, aber nicht von einer Webanwendung aus?
Update: Ich habe meinen Spike in den SignalR-Quellcode eingehängt und wenn er von einer der Webanwendungen aus ausgeführt wird, bleibt die Ausführung in Zeile 130 von SignalR.Client.Connection hängen. Der _syncContext für eine solche Verbindung ist eine Instanz von AspNetSynchronizationContext, und beim Aufruf seiner Post()-Methode bleibt alles stehen.