2013-04-14 13 views
5

Chcę przesłać dane do mojej aplikacji konsolowej, która ma połączenie z moim "someHub". Próbowałem zrobić, jak opisano w przykładzie z a link, ale nie otrzymałem wyniku. Server side Kod:SignalR: Jak wywołać metodę klienta .Net z serwera?

[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 kod boczny:

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(); 
    } 
} 

Co jest najlepszym rozwiązaniem dla realizacji tego i tego, co jest powodem, dla którego nie jestem w stanie wywołać metodę klienta?

+0

Zadzwoniłeś do MapHubs? – halter73

+0

Tak, zrobiłem. Połączenia od klienta do serwera działają prawidłowo: myHub.Invoke ("GetValue"). ContinueWith (task => Console.WriteLine ("Wartość z serwera {0}", task.Result)); , ale z serwera na klienta - nr – Denis

+0

Możliwy duplikat [SignalR + wysłanie wiadomości do centrum za pomocą metody działania] (http://stackoverflow.com/questions/7549179/signalr-posting-a-message- do-a-hub-via-an-action-method) – Liam

Odpowiedz

9

Czy próbujesz rozmawiać z klientami spoza Hub? Jeśli tak, będziesz musiał uzyskać HubContext poza Hub. A potem możesz rozmawiać ze wszystkimi klientami.

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

SignalR Server przy użyciu Owin Samodzielny 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 Application Konsola spożywania Signalr Huby.

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(); 
     } 
    } 

Aby uruchomić ten kod, należy utworzyć dwa oddzielne aplikacje, a następnie aplikację pierwszego serwera, a następnie uruchomić aplikację konsoli klienta, a następnie po prostu naciśnij klawisz na konsoli serwera i rozpocznie wysyłanie wiadomości do klienta.

+2

Dzięki. Zmieniłem Clients.Caller.sendSomeData ("hello"); do Clients.Client (Context.ConnectionId) .sendOrders ("hello"); i wszystko działa. – Denis

+1

Ta odpowiedź nie stanowi odpowiedzi na pytanie, nie ma związku z żadną odpowiedzią ogólną. Wreszcie zmienia się Clients.Caller.sendSomeData ("hello"); do Clients.Client (Context.ConnectionId) .sendOrders ("hello"); nie powinno mieć znaczenia. Zalecam, aby nie oznaczać tej odpowiedzi jako prawidłową i dalej badać problem –

Powiązane problemy