2014-07-25 12 views
10

Ho un'applicazione Web ASP.NET con una semplice pagina HTML e alcuni JavaScript per comunicare tramite SignalR. Funziona bene Ora sto cercando di chiamare un metodo su Hub da un altro progetto (nella stessa soluzione) e utilizzando l'API client .NET Signalr:SignalR 2.1.0: La connessione non è stata stabilita

 var connection = new HubConnection("http://localhost:32986/"); 
     var hub = connection.CreateHubProxy("MessageHub"); 
     connection.Start(); 
     hub.Invoke("SendMessage", "", ""); 

L'ultima riga causa InvalidOperationException: The connection has not been established. ma sono in grado di connettersi all'hub dal mio codice JavaScript.

Come posso connettermi all'hub utilizzando il codice C#?

UPDATE

Nel momento in cui dopo aver scritto questo post, ho provato ad aggiungere .Wait() e ha funzionato! Quindi questo farà:

 var connection = new HubConnection("http://localhost:32986/"); 
     var hub = connection.CreateHubProxy("MessageHub"); 
     connection.Start().Wait(); 
     hub.Invoke("SendMessage", "", ""); 

risposta

12

HubConnection.Start restituisce un Task che ha bisogno di completare prima di poter invocare un metodo.

I due modi per fare questo sono da utilizzare attendere se si è in un metodo asincrono, o per usare Task.Wait() se si è in un metodo non-asincrono:

public async Task StartConnection() 
{ 
    var connection = new HubConnection("http://localhost:32986/"); 
    var hub = connection.CreateHubProxy("MessageHub"); 
    await connection.Start(); 
    await hub.Invoke("SendMessage", "", ""); 
    // ... 
} 

// or 

public void StartConnection() 
{ 
    var connection = new HubConnection("http://localhost:32986/"); 
    var hub = connection.CreateHubProxy("MessageHub"); 
    connection.Start().Wait(); 
    hub.Invoke("SendMessage", "", "").Wait(); 
    // ... 
} 

Il "come stabilire una connessione "la sezione di ASP.NET SignalR Hubs API Guide for the .NET client. entra ancora più in dettaglio.

+1

Terza opzione: 'ContinueWith'. Questo è essenzialmente il modo in cui viene eseguito dal lato client, quindi aggiunge un po 'di coerenza tra gli usi di JS e C#. – Corey

Problemi correlati