2

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

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

我如何在它们之间进行交流?比方说

  1. 我需要每隔几秒钟在网络浏览器中从 EC2 机器上获取一些信息——(CPU 负载或类似的东西)
  2. 按需(当用户单击网页上的按钮时)它应该拉取所选机器的其他内容(比如说 C: 驱动器上的 AvailibleDiskSpace)

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

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

4

3 回答 3

2

您最好的选择可能是将 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>()与连接到与被调用集线器不同的集线器的客户端进行通信。

于 2012-10-03T17:36:03.767 回答
1

一个问题很多...... :)

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

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

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

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

至于 SignalR 示例,老实说,您正在考虑构建的内容与向您展示如何操作的基本文档没有什么不同。您需要查看控制台应用程序/Windows 服务的 .NET 客户端中心 wiki 页面,您需要查看浏览器应用程序的浏览器客户端 wiki 页面,然后如果需要,您需要查看自托管 wiki 页面在 IIS+ASP.NET 之外托管您的服务器。

于 2012-10-03T17:18:31.453 回答
1

您将需要使用集线器。

这是一个如何做到这一点的例子(在 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

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

于 2012-10-03T16:48:12.073 回答