Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api和信号发布_Asp.net_Asp.net Mvc_Asp.net Web Api_Signalr_Signalr Hub - Fatal编程技术网

Asp.net web api和信号发布

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

我有一个从物联网设备获取实时数据的web api。我的数据是地理坐标(lon、lat)

在第一个场景中,我正在保存数据库。所以我有一个客户端应用程序,它有一个映射。我想在地图上实时显示传入的位置

但信号器有一个单独的中心类

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;
        }
}