【问题标题】:Asp.net web api and SignalR publishAsp.net web api 和 SignalR 发布
【发布时间】:2017-04-06 20:38:50
【问题描述】:

我有一个从 IoT 设备获取实时数据的 web api。我的数据是地理坐标(经度、纬度)

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

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-web-api signalr signalr-hub


    【解决方案1】:

    您的客户端应用程序首先应将自己订阅到服务器 signalR Subscribe() 方法,您可以将其添加到如下所示的某个组中。

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

    【讨论】:

      【解决方案2】:

      也许我误解了,但您可以像这样在您的集线器中创建一个静态函数:

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

      并像这样从您的 post 函数中调用它:

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

      【讨论】:

      • 在客户端找不到静态集线器方法。
      • 他们工作得很好,你能放一些代码来检查你的问题在哪里(客户端也是)。 EnableDetailedErrors 也可以提供帮助:var hubConfiguration = new HubConfiguration { EnableDetailedErrors = true }; app.MapSignalR(hubConfiguration);
      猜你喜欢
      • 2015-07-27
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2013-02-08
      • 2016-08-09
      • 2017-07-05
      相关资源
      最近更新 更多