2013-04-14 16 views
5

Desidero inviare i dati alla mia applicazione console che ha una connessione al mio "someHub". Ho provato a fare come descritto nell'esempio da a link ma non ho ottenuto alcun risultato. codice lato server :SignalR: Come chiamare il metodo client .Net dal server?

[HubName("somehub")] 
public class SomeHub : Hub 
{ 
    public override Task OnConnected() 
    { 
     //Here I want to send "hello" on my sonsole application 
     Clients.Caller.sendSomeData("hello"); 

     return base.OnConnected(); 
    } 
} 

Clien codice lato:

public class Provider 
{ 
    protected HubConnection Connection; 
    private IHubProxy _someHub; 

    public Provider() 
    { 
     Connection = new HubConnection("http://localhost:4702/"); 
     _someHub = Connection.CreateHubProxy("somehub"); 
     Init(); 
    } 

    private void Init() 
    { 
     _someHub.On<string>("sendSomeData", s => 
     { 
      //This code is not reachable 
      Console.WriteLine("Some data from server({0})", s); 
     }); 

     Connection.Start().Wait(); 
    } 
} 

Qual è la soluzione migliore per l'attuazione di questo e che cosa è la ragione per cui io non sono in grado di richiamare il metodo cliente?

+0

Hai chiamato MapHubs? – halter73

+0

Sì, l'ho fatto. Le chiamate dal client al server funzionano come: myHub.Invoke ("GetValue"). ContinueWith (task => Console.WriteLine ("Valore dal server {0}", task.Result)); , ma dal server al client - no – Denis

+0

Possibile duplicato di [SignalR + postare un messaggio su un hub tramite un metodo di azione] (http://stackoverflow.com/questions/7549179/signalr-posting-a-message- to-a-hub-via-un-action-metodo) – Liam

risposta

9

Stai cercando di parlare con i clienti al di fuori di Hub? In caso affermativo, sarà necessario ottenere un HubContext all'esterno di Hub. E poi puoi parlare a tutti i clienti.

IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

SignalR Server utilizzando Owin Auto Host

class Program 
    { 
     static void Main(string[] args) 
     { 
      string url = "http://localhost:8081/"; 

      using (WebApplication.Start<Startup>(url)) 
      { 
       Console.WriteLine("Server running on {0}", url); 
       Console.ReadLine(); 
       IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
       for (int i = 0; i < 100; i++) 
       { 
        System.Threading.Thread.Sleep(3000); 
        context.Clients.All.addMessage("Current integer value : " + i.ToString()); 
       } 
       Console.ReadLine(); 
      } 

     } 
    } 
    class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      // Turn cross domain on 
      var config = new HubConfiguration { EnableCrossDomain = true }; 
      config.EnableJavaScriptProxies = true; 

      // This will map out to http://localhost:8081/signalr by default 
      app.MapHubs(config); 
     } 
    } 
    [HubName("MyHub")] 
    public class MyHub : Hub 
    { 
     public void Chatter(string message) 
     { 
      Clients.All.addMessage(message); 
     } 
    } 

Signalr client Applicazione console consumando Signalr Hub.

class Program 
    { 
     static void Main(string[] args) 
     { 
      var connection = new HubConnection("http://localhost:8081/"); 

      var myHub = connection.CreateHubProxy("MyHub"); 

      connection.Start().Wait(); 
      // Static type 
      myHub.On<string>("addMessage", myString => 
      { 
       Console.WriteLine("This is client getting messages from server :{0}", myString); 
      }); 


      myHub.Invoke("Chatter",System.DateTime.Now.ToString()).Wait(); 


      Console.Read(); 
     } 
    } 

Per eseguire questo codice, creare due applicazioni separate, quindi prima applicazione server di esecuzione e quindi l'applicazione console client, quindi basta premere il tasto sulla console del server e inizierà l'invio di messaggi al client.

+2

Grazie. Ho cambiato Clients.Caller.sendSomeData ("ciao"); a Clients.Client (Context.ConnectionId) .sendOrders ("ciao"); e tutto funziona. – Denis

+1

Questa risposta non risponde alla domanda, non è correlata e più di una risposta di informazioni generali. Cambiando infine Clients.Caller.sendSomeData ("ciao"); a Clients.Client (Context.ConnectionId) .sendOrders ("ciao"); non dovrebbe fare la differenza Consiglierei di non contrassegnare questa risposta come corretta e di approfondire il problema –

Problemi correlati