2013-04-14 19 views
5

"someHub"に接続している私のコンソールアプリケーションにデータを送信したい。私はa linkの例で説明したようにしようとしましたが、結果はありませんでした。 サーバー側のコード:SignalR:サーバから.Netクライアントメソッドを呼び出す方法?

[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側のコード:

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

これを実装するための最善の解決策は何であると私はクライアントのメソッドを呼び出すことはできませんよ理由は何ですか?

+0

MapHubを呼び出しましたか? – halter73

+0

はい私はしました。クライアントからサーバーへの呼び出しは、 myHub.Invoke ( "GetValue")。ContinueWith(task => )Console.WriteLine(サーバーからの値{0} "、task.Result)); 、ただしサーバーからクライアントへ - – Denis

+0

[SignalR +と重複している可能性のあるメッセージをハブに送信する](http://stackoverflow.com/questions/7549179/signalr-posting-a-message- to-a-hub-via-an-action-method) – Liam

答えて

9

ハブの外にいるクライアントと話したいですか?はいの場合、Hubの外にHubContextを取得する必要があります。そして、あなたはすべてのクライアントと話すことができます。 Owinセルフホストを使用して

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

SignalRサーバー

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ハブを消費Signalrクライアントコンソールアプリケーション。

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

は、このコードを実行する二つの別々のアプリケーション、その後、最初の実行サーバアプリケーションとクライアントコンソールアプリケーションを作成するために、そしてちょうどサーバコンソール上のキーを押すと、それはクライアントへのメッセージの送信を開始します。

+2

ありがとうございました。私はClients.Caller.sendSomeData( "hello")を変更しました。クライアント(Context.ConnectionId).sendOrders( "hello");すべてが働いています。 – Denis

+1

この回答は質問に答えるものではありません。一般的な情報の回答とは無関係です。最後にClients.Caller.sendSomeData( "hello")を変更します。クライアント(Context.ConnectionId).sendOrders( "hello");違いはありません。この回答を正しいものとしてマークし、問題をさらに調査することをおすすめします –

関連する問題