Asp.net web api和SignalR发布
问题描述:
我有一个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();
}
}
答
也许我误解了,但你可以在你的集线器这样创建一个静态函数:
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();
}
答
客户端应用程序首先应该自己订阅服务器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;
}
}
静hub方法在客户端找不到。 – barteloma
他们工作的很好,你能否提供一些代码来检查你的问题(客户端)。 EnableDetailedErrors也可以提供帮助:'var hubConfiguration = new HubConfiguration {EnableDetailedErrors = true}; app.MapSignalR(hubConfiguration);' –