2017-04-06 18 views
-1

私はIoTデバイスからリアルタイムデータを取得するWeb APIを持っています。私のデータは地理座標(lon、lat)Asp.net web apiとSignalR publish

public class DataController: ApiController{ 
    public IHttpActionResult Post(Location loc){ 
     // save loc to database. 
    } 
} 

です。この最初のシナリオでは、私はdatabseを保存しています。だから私は地図を持っているクライアントアプリケーションを持っています。私はマップ上の着信位置をリアルタイムで表示したいと考えています。

しかし、SignalRには分離されたHubクラスがあります。

public class DataPublisherHub : Hub 
{ 
    public void PublishCoordinates() 
    { 
     // I want to send all clients incoming locations that web api action. 
     //???? 
     Clients.All.sendAll(); 
    } 
} 

答えて

0

は、たぶん私は誤解がありますが、このようなあなたのハブに静的関数を作成することができます。

public class DataPublisherHub : Hub 
{ 
    public static void PublishCoordinates(string lat, string long) 
    { 
     // I want to send all clients incoming locations that web api action. 
     //???? 
     var context = GlobalHost.ConnectionManager.GetHubContext<DataPublisherHub>();   
     context.Clients.All.sendLatLong(lat,long); 
    } 
} 

と、このようなあなたのポスト関数からそれを呼び出す:

public class DataController: ApiController{ 
    public IHttpActionResult Post(Location loc){ 
     // save loc to database. 
     DataPublisherHub.PublishCoordinates(loc.lat,loc.long) 
    } 
} 

EDIT:

データベース内のすべての既存のデータを得るためにあなたのハブでOnConnected()機能:

public override Task OnConnected() 
{ 
    //Get all datas from db 
    foreach (var data in datas){ 
     Clients.Caller.sendLatLong(data.lat,data.long); 
    } 
    return base.OnConnected();    
} 
+0

静的ハブメソッドはクライアント側では見つかりません。 – barteloma

+0

彼らはうまくいきます。あなたの問題がどこにあるかを確認するコードをいくつか入れてもらえますか(クライアント側も)。 EnableDetailedErrorsも役に立ちます: 'var hubConfiguration = new HubConfiguration {EnableDetailedErrors = true}; app.MapSignalR(hubConfiguration); ' –

0

クライアントアプリケーションは、最初にすべてのあなたは、以下のようないくつかのグループに追加することができ、サーバsignalR購読()メソッドに自分自身を購読する必要があります。その後

public void Subscribe(long clientId) 
    { 
     Groups.Add(Context.ConnectionId, clientId.ToString()); 
    } 

、データベースにあなたの座標を保存した後、同様にハブでPublishCordinates()メソッドを呼び出します。

public IHttpActionResult Post(Location loc) 
{ 
    // save loc to database. 
    DataPublisherHub.PublishCordinates(loc); 
} 

変更PublishCordinates()メソッドのように:

public void PublishCoordinates(Location loc) 
{ 
    try 
     { 
      var context = GlobalHost.ConnectionManager.GetHubContext<DataPublisherHub>(); 
      context.Clients.Group(clientId.ToString()).Recieve(loc); 
     } 
     catch(Exception ex) 
     { 
      return; 
     } 
}