Also habe ich alle anderen SO Fragen in Bezug auf diese gelesen, aber es sieht aus wie alles richtig eingerichtet werden sollte. Ich führe eine selbst gehostete SignalR-Konsolenanwendung mit einer einzelnen leeren Hub-Deklaration aus (dies ist für die unidirektionale Kommunikation vom Server zu verbundenen Clients).SignalR Client Methoden nicht aufrufen
EDIT: Link zum Projekt, das das Problem reproduziert - https://dl.dropboxusercontent.com/u/66477739/SignalRTest.zip
Die Demo-Lösung hat 3 Projekte:
- SignalRTest.BusinessLogic - einfache Konsole-Anwendung, die einfach eine Nachricht alle 10 Sekunden veröffentlicht. Diese Nachrichten werden niemals vom Client empfangen. Dies simuliert meine Geschäftslogikschicht, die Benachrichtigungen an verbundene Clients sendet.
- SignalRTest.SelfHost - Die selbst gehostete SignalR-Anwendung + Hub. Ich fügte dem Hub eine "Send" -Methode hinzu, um zu zeigen, dass alles funktioniert, wenn ein Client
server.send('message');
aufruft, aber es funktioniert nicht, wenn der Server die Nachricht einleitet. Wenn Sie in dieses Konsolenfenster tippen und die Eingabetaste drücken, wird dieser Text an die Web-App gesendet. DAS FUNKTIONIERT! - SignalRTest.UI - Nur eine leere MVC-App mit einer einzigen Seite, die die erforderlichen Skripts lädt. Eine erfolgreich empfangene Nachricht würde nur die Konsolenausgabe protokollieren. In diesem Beispiel wird es keine Änderungen an der Benutzeroberfläche geben.
PublishStatusHub.cs
public class PublishStatusHub : Hub
{
}
JS
$(document).ready(function() {
$.connection.hub.url = "http://localhost:8080/signalr";
var publish = $.connection.publishStatusHub;
publish.client.addMessage = function (message) {
console.log(message);
};
$.connection.hub.start().done(function() { });
});
aus einer separaten Baugruppe
var context = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>();
context.Clients.All.addMessage("Starting publish...");
Telefonvorwahl
Obwohl ich sehen kann, dass der obige Code ausgeführt wird (über Breakpoints), wird die Client-Methode nie aufgerufen.
Ich habe SignalR Protokollierung eingeschaltet und keine Ausnahmen werden geworfen. Außerdem protokolliert es niemals die eingehenden Nachrichten.
Program.cs Jetzt
static void Main(string[] args)
{
string url = "http://localhost:8080";
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
while (true)
{
string message = Console.ReadLine();
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>();
hubContext.Clients.All.addMessage(message);
}
}
}
:
Interessanterweise kann ich Nachrichten an den Client durch meine Methode Main() in Program.cs innerhalb der selbst gehosteten Konsole App geschickt bekommen Wenn ich das Konsolenfenster eintippe und Enter drücke, wird die Nachricht erfolgreich an den Client gesendet und im Konsolenausgabefenster protokolliert.
jedoch, wenn ich diesen Code auf eine andere Datei innerhalb derselben Konsolenanwendung bewegen und dann von einer anderen Baugruppe nennen (das ist das Endziel), scheitert es still wieder:
MessagePublisher.cs
public class MessagePublisher
{
public void Publish(string message)
{
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>();
hubContext.Clients.All.addMessage(message);
}
}
aus einer separaten Assembly Telefonvorwahl
var messagePublisher = new MessagePublisher();
messagePublisher.Publish("Test message");
ich bin stecken, warum kann ich keine Nachrichten an den angeschlossenen Clients von externen Baugruppen veröffentlichen.
So Einrichtung Ihres signlarR Server in Konsolenanwendung, dann versuchen Nachricht von einer anderen Assembly zu veröffentlichen (während immer noch die gleiche Konsole-Anwendung ausgeführt wird) und es scheitert? – Evk
Ja, das ist richtig. – Scott
Vielleicht haben Sie minimale VS-Projekt, das das reproduziert? – Evk