2013-05-25 13 views
5

Próbuję pobrać moją aplikację kliencką WPF do odbierania komunikatu SignalR wysłanego przez usługę WCF. Próbowałem wielu rzeczy i teraz uciekam się do hakowania w nadziei, że coś po prostu działa. Po zapoznaniu się z tutoriali i przykładów online, po prostu nie mogę uzyskać mojej metody WPF OnSignalRMessage(), aby uzyskać wywołanie. Gdzie ja się tu mylę?Komunikat SignalR nie jest odbierany przez klienta.

Moja piasta:

public class PrestoHub : Hub 
{ 
    public void Send(string message) 
    { 
     Clients.All.OnSignalRMessage(message); 
    } 
} 

Moja klasa startowy:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HubConfiguration { EnableCrossDomain = true }; 

     app.MapHubs("http://localhost:8084", config); 
    } 
} 

Sposób, który rozpoczyna mojego gospodarza SignalR (w moim hosta usługi WCF):

private void StartSignalRHost() 
    { 
     const string url = "http://localhost:8084"; 
     WebApplication.Start<Startup>(url); 
    } 

Kod aby wysłać wiadomość:

GlobalHost.ConnectionManager.GetHubContext<PrestoHub>().Clients.All.OnSignalRMessage("snuh"); 
Console.WriteLine("Sent 'snuh' to all clients..."); 

My WPF metody klienckie:

private void InitializeSignalR() 
    { 
     var hubConnection = new Connection("http://localhost:8084"); 
     hubConnection.Start(); 
     hubConnection.Received += OnSignalRMessage; 
    } 

    private void OnSignalRMessage(string data) 
    { 
     MessageBox.Show(data); 
    } 

Odpowiedz

3

Chociaż ja wciąż stara się zrozumieć, jak i dlaczego, udało mi się uzyskać jego pracy. +1 do N. Taylor Mullen za skierowanie mnie we właściwym kierunku. Oprócz jego sugestii po stronie klienta, musiałem również zmienić kod serwera, a mianowicie za pomocą pustego koncentratora i uproszczonej klasy Startup.

Moja piasta:

public class PrestoHub : Hub{} 

Uwaga: Piasta jest pusty, bo nie jesteśmy wywołanie metody w jego obrębie. Jak zobaczymy później, otrzymamy kontekst koncentratora i wysyłamy wiadomości do klientów.

Moja klasa startowy:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapHubs(); 
    } 
} 

Powyższy kod wydaje się być co rozwiązaniu problemu.Działa to również:

var config = new HubConfiguration { EnableCrossDomain = true }; 
app.MapHubs(config); 

Ale jak tylko podać adres URL, mój klient nie otrzymuje wiadomości (próbowałem zi bez „SignalR” części):

app.MapHubs("http://localhost:8084/SignalR", config); 

Sposób który rozpoczyna mojego gospodarza SignalR (w moim hosta usługi WCF):

private void StartSignalRHost() 
{ 
    const string url = "http://localhost:8084"; 
    WebApplication.Start<Startup>(url); 
} 

Kod faktycznie wysłać jakąś wiadomość:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>(); 
hubContext.Clients.All.OnSignalRMessage("snuh"); 

Moja metoda WPF klient:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => 
     { 
      MessageBox.Show(data); 
     }); 
    hubConnection.Start(); 
} 
+0

Powód, dla którego podanie adresu URL spowodowało awarię aplikacji: https://github.com/SignalR/SignalR/issues/962 –

+0

Czyli dlatego, że podałem pełny adres URL? Jeśli chcę to zmienić, muszę zrobić coś takiego? 'MapHubs (" ~/SignalR2 ")' –

1

Tworzysz nie PersistentConnection piasta. Aby otrzymywać wiadomości z PrestoHub, musisz najpierw połączyć się z HubConnection, a następnie musisz obsłużyć zdarzenie "OnSignalRMessage".

Więc kod klient będzie teraz wyglądać tak:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 

    // Bind the "OnSignalRMessage" to a function 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => { 
     MessageBox.Show(data); 
    }); 

    hubConnection.Start(); 
} 
+0

Faktycznie, używając 'HubConnection' był jednym z moich prób. Po prostu wypróbowałem twój przykładowy kod i 'MessageBox.Show()' nie został trafiony. –

+0

Upewnij się, że Twój MapHubs został trafiony, a jeśli jest dostępny w http: // localhost: 8084/signalr/hubs w przeglądarce internetowej i sprawdź, czy otrzymujesz plik javascript. –

+0

MapHubs jest trafiony, ale ta strona nie pojawi się w przeglądarce. Właśnie wydrukowałem ebook SignalR. Przeczytam to i zrobię jeszcze więcej problemów. Dzięki za wskazówki. –

0

Jeśli metody po stronie serwera są asynchroniczne upewnić wrócą zadanie zamiast nieważne. Czyli trzeba mieć

public async Task Method(){ } 

i nie

public async void Method(){ } 
Powiązane problemy