2016-10-02 2 views
0

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.

+0

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

+0

Ja, das ist richtig. – Scott

+0

Vielleicht haben Sie minimale VS-Projekt, das das reproduziert? – Evk

Antwort

2

In dem von Ihnen veröffentlichten Projekt versuchen Sie, eine Nachricht aus einer anderen Konsolenanwendung zu veröffentlichen (SignalRTest.BusinessLogic). Diese Anwendung hostet keinen SignalR-Dienst und hat daher keine Ahnung von verbundenen Clients. Alle Clients sind in einem anderen Prozess mit dem Dienst verbunden, der von einer anderen Anwendung gehostet wird (SinglaRTest.SelfHost). Es gibt also keine Möglichkeit, wie das funktionieren könnte. Wenn Sie Ihren Dienst in BusinessLogic Anwendung starten, wird dies wie gewohnt funktionieren.

+0

Das BusinessLogic-Projekt ruft MessagePublisher.Publish() auf, das im SelfHost-Projekt vorhanden ist (und wiederum versucht, Nachrichten an verbundene Clients zu senden - von SelfHost aus). In der BusinessLogic-Klasse gibt es keinen Code, der etwas mit SignalR zu tun hat. Verstehe ich Ihre Bedenken richtig? – Scott

+0

Ihr BusinessModel ist eine Konsolenanwendung, die Sie ausführen. Ja, es verweist auf SelfHost, aber SignalR läuft nicht, also warum sollte es etwas veröffentlichen können? Führen Sie BusinessLogic nicht als Konsolenanwendung aus, sondern referenzieren Sie stattdessen vom Host. – Evk

+0

Um mehr zu klären, nur Prozess, der Signalgeber Nachrichten an Clients veröffentlichen kann, können Sie dies nicht von anderen Prozessen – Evk

0

Ich denke, man einen Konstruktor erstellt haben, können Sie es entfernen ...

Verwandte Themen