Asp.net web api和信号发布
我有一个从物联网设备获取实时数据的web api。我的数据是地理坐标(lon、lat) 在第一个场景中,我正在保存数据库。所以我有一个客户端应用程序,它有一个映射。我想在地图上实时显示传入的位置 但信号器有一个单独的中心类Asp.net web api和信号发布,asp.net,asp.net-mvc,asp.net-web-api,signalr,signalr-hub,Asp.net,Asp.net Mvc,Asp.net Web Api,Signalr,Signalr Hub,我有一个从物联网设备获取实时数据的web api。我的数据是地理坐标(lon、lat) 在第一个场景中,我正在保存数据库。所以我有一个客户端应用程序,它有一个映射。我想在地图上实时显示传入的位置 但信号器有一个单独的中心类 public class DataPublisherHub : Hub { public void PublishCoordinates() { // I want to send all clients incoming locations
public class DataPublisherHub : Hub
{
public void PublishCoordinates()
{
// I want to send all clients incoming locations that web api action.
//????
Clients.All.sendAll();
}
}
也许我误解了,但您可以在中心创建一个静态函数,如下所示:
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();
}
您的客户机应用程序首先应该将自己订阅到server signer subscribe()方法,在该方法中,您可以将其添加到下面这样的组中
public void Subscribe(long clientId)
{
Groups.Add(Context.ConnectionId, clientId.ToString());
}
然后,在将坐标保存到数据库后,在hub中调用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;
}
}
public void publish坐标(位置loc)
{
尝试
{
var context=GlobalHost.ConnectionManager.GetHubContext();
context.Clients.Group(clientId.ToString()).receive(loc);
}
捕获(例外情况除外)
{
返回;
}
}
客户端找不到静态集线器方法。它们工作得很好,您可以输入一些代码来检查问题所在(客户端也是)。EnableDetailedErrors也有帮助:var-hubConfiguration=new-hubConfiguration{EnableDetailedErrors=true};应用程序MapSignal(HUB配置)代码>
public void PublishCoordinates(Location loc)
{
try
{
var context = GlobalHost.ConnectionManager.GetHubContext<DataPublisherHub>();
context.Clients.Group(clientId.ToString()).Recieve(loc);
}
catch(Exception ex)
{
return;
}
}