2017-04-06 147 views
-1

我有一個web api可以從物聯網設備獲取實時數據。我的數據是地理座標(lon,lat)Asp.net web api和SignalR發佈

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

在這第一種情況下,我正在保存數據庫。所以我有一個有地圖的客戶端應用程序。並且我想實時顯示地圖上的傳入位置。

但是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) 
    } 
} 

編輯:

不要忘記實現在集線器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

靜hub方法在客戶端找不到。 – 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; 
     } 
}