SignalR和异构类型的客户端

时间:2012-10-03 15:18:16

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

我是SignalR的新手,所以请原谅我某个愚蠢的问题。

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

我如何在这些之间进行交流?我们说

  1. 我需要在网络浏览器中每隔几秒钟获取一些信息 从EC2机器 - (CPU负载或类似的东西)
  2. 按需提供 (当用户点击网页上的按钮时)它应该拉出一些东西 所选机器的其他(假设在C:驱动器上使用AvailibleDiskSpace)
  3. 我应该使用什么 - Hub或PersistentConnection?在这种情况下,控制台应用程序也将是客户端或SelfHosts(无论如何,SelfHost是什么?)

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

3 个答案:

答案 0 :(得分:2)

您最好的选择是在IIS上托管SignalR服务器和MVC应用程序。由于您已经设置了IIS,因此不要担心自托管。

我认为你可以更轻松地使用Hubs over 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>()与连接到不同集线器的客户端进行通信。

答案 1 :(得分: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

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

答案 2 :(得分:1)

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

首先,控制台应用程序/ Windows服务可能只是客户端与浏览器相同的Hub。完全没有理由下载到PersistentConnection编程模型。

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

  1. 如果你需要每隔几秒钟推送一次状态,这就像SignalR客户端方法一样完美。您只需根据可能从性能计数器接收的任何通知在客户端上调用该方法。这个逻辑可以在Hub本身内,也可以简单地从Hub的客户端调用一个方法,然后将其“扇形化”到集线器的所有其他客户端(建议使用后者)。
  2. 对于ServerA场景中的按钮/获取可用空间,您正在讨论多个层。您需要以某种方式从浏览器获取消息到ServerA的中心以获取您正在查找的结果,然后响应浏览器。老实说,这不是完全由SignalR解决的。 ServerA需要拥有自己的服务接口,Hub可以调出来获取结果并能够响应浏览器客户端。然后,您将让浏览器调用hub方法,hub方法将向ServerA发出请求,等待结果,然后将结果返回给浏览器。那里有许多路由工作要做,但没有什么神奇的,没有什么特别的SignalR。对于所有意图和目的,这种情况今天可以在纯粹的Web服务架构中完成。
  3. 接下来,自我主机意味着在IIS + ASP.NET以外的主机中托管SignalR服务器。例如,您可以在另一个控制台应用程序或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之外托管您的服务器,则需要look at the self hosting wiki page .NET。