2017-04-06 117 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; 
     } 
}