【问题标题】:SignalR and heterogeneous types of clientsSignalR 和异构类型的客户端
【发布时间】:2012-10-04 01:36:03
【问题描述】:

我对 SignalR 完全陌生,所以请原谅我的愚蠢问题。

假设我有许多在 AWS EC2 实例上运行的控制台应用程序(或 Windows 服务), 我有一个 Web 服务器(托管 MVC3 的 IIS),当然我有无数个 Web 客户端...

我如何在它们之间进行通信?比方说

  1. 我需要每隔几秒钟在网络浏览器中获取一些信息 来自 EC2 机器 - (CPU 负载或类似的东西)
  2. 按需 (当用户单击网页上的按钮时)它应该拉一些东西 选定机器的 else(假设 C: 驱动器上的 AvailibleDiskSpace)

我应该使用什么 - Hub 或 PersistentConnection?在这种情况下,控制台应用程序也将是客户端或 SelfHosts(SelfHost 到底是什么?)

是否有任何示例代码可以让我学习如何构建类似的东西? (我相信 Nuget 和 Github 和 VideoTutorials 上的示例向您展示了如何构建单服务器/多 Web 客户端解决方案,但不是我需要的)

【问题讨论】:

    标签: c# asp.net-mvc signalr signalr-hub signalr.client


    【解决方案1】:

    最好的选择可能是将 SignalR 服务器与 MVC 应用程序一起托管在 IIS 上。不用担心自托管,因为您已经设置了 IIS。

    我认为你会更容易使用 Hubs 而不是 PersistentConnections,因为 Hubs 允许 RPC。

    在您的控制台应用程序和 Windows 服务中,我建议使用 SignalR .NET 客户端。

    https://github.com/SignalR/SignalR/wiki/SignalR-Client-Hubs

    您可以将数据从控制台应用程序推送和拉取到 SignalR 服务器,然后该服务器可以充当浏览器客户端的代理。当然,SignalR 服务器可以双向代理,允许任何客户端向任何其他客户端发送实时消息或请求。

    https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs

    您的 .NET 和 JS 客户端可以访问同一个集线器或不同的集线器。如果所有客户端都访问同一个集线器,您可能希望将它们分成组,以便区分这两种类型的客户端。如果您选择使用多个集线器,您可能希望使用GlobalHost.ConnectionManager.GetHubContext<MyHub>() 与连接到与被调用集线器不同的集线器的客户端进行通信。

    【讨论】:

      【解决方案2】:

      你会想要使用一个集线器。

      这是一个如何做的例子(在 0.5.3 中):

      服务器端(集线器):

      public class MyDashboard : Hub
      {
          /* Have this method called every few seconds via a timer */
          public void SendLoad()
          {
              // Will call the "retrieveLoad" JS method on the clients
              Clients.retrieveLoad(new {
                  CPU = 10.25, // Put something relevant here
                  Memory = "80%" // Again, put something relevant here
              });
          }
      
          public double GetDiskSpace()
          {
              return 3829847; // You'd replace the number with something more relevant
          }
      }
      

      客户端(javascript):

      var dashboard = $.connection.myDashboard;
      
      dashboard.retrieveLoad = function(info) {
          console.log("The CPU is at: " + info.CPU);
          console.log("The Memory is at: " + info.Memory);
      }
      
      $.connection.hub.start(function() {
          // This is called once the hub has started, so we need to wire up our click event
          $("#myButton").click(function() {
              dashboard.getDiskSpace(function(space) {
                  console.log("The disk space is at: " + space);
              });
          });
      });
      

      希望这会有所帮助!随时在我们的 JabbR 房间停下来与其他人讨论该框架:http://jabbr.net/#/rooms/signalr

      注意:请记住,如果您希望任何内容(私有/公共变量等)保留在您的集线器上以使该数据成为静态数据。

      【讨论】:

      • 不,我的意思是我应该把集线器放在哪里?在 MVC 应用程序上,对吧?那么 EC2 机器上的应用程序如何通过 Web 服务器将其内容发送到 Web 客户端?
      • EC2 机器通过名为 SignalR.Client 的 .NET 库作为常规客户端连接到 MVC 应用程序中的 SignalR 服务器。然后,您可以让客户端调用服务器上的 hub 方法,该方法又向连接的客户端广播(它们是 JS 还是 .NET 无关紧要)。
      【解决方案3】:

      一大堆问题... :)

      首先,控制台应用程序/Windows 服务可能只是客户端,就像浏览器对相同 Hub 一样。完全没有理由为此使用PersistentConnection 编程模型。

      其次,您讨论两个不同的用例:

      1. 如果您需要每隔几秒推送一次状态,这非常适合作为 SignalR 客户端方法。您只需根据可能从性能计数器收到的任何通知在客户端上调用该方法。此逻辑可能位于 Hub 本身内,也可能只是来自 Hub 的客户端调用的方法,然后该方法将“扇出”到 Hub 的所有其他客户端(建议使用后者)。
      2. 对于 ServerA 场景中的按钮按下/获取可用空间,您正在谈论几个层。您不知何故需要从浏览器到集线器到 ServerA 获取一条消息,以获得您正在寻找的结果,然后响应浏览器。老实说,这不是由 SignalR 纯粹解决的。 ServerA 需要有自己的服务接口,集线器可以调用它来获取结果并能够响应浏览器客户端。然后,您将让浏览器调用 hub 方法,hub 方法将向 ServerA 发出请求,等待结果,然后将结果返回给浏览器。那里有很多路由工作要做,但没有什么神奇的,也没有特定于 SignalR 的。出于所有意图和目的,这种场景现在可以在纯 Web 服务架构中完成。

      接下来,Self-Host 表示 SignalR 服务器托管在 IIS+ASP.NET 以外的主机中。例如,您可以在另一个控制台应用程序或 Windows 服务中启动 SignalR 服务,而不是在 IIS+ASP.NET 中托管。你可以找到关于自托管 here in the SignalR Wiki 的不错的文档。

      至于 SignalR 示例,老实说,您正在考虑构建的内容与向您展示如何操作的基本文档没有什么不同。对于控制台应用程序/Windows 服务,您需要 look at the .NET client hub wiki page,对于您的浏览器应用程序,您需要 look at the browser client wiki page,如果您想在 IIS+ASP.NET 之外托管您的服务器,则需要 look at the self hosting wiki page

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-17
        • 1970-01-01
        相关资源
        最近更新 更多