C# signer和异构类型的客户端

C# signer和异构类型的客户端,c#,asp.net-mvc,signalr,signalr-hub,signalr.client,C#,Asp.net Mvc,Signalr,Signalr Hub,Signalr.client,我对信号员来说是个新手,所以请原谅我这个愚蠢的问题 比如说,我有许多在AWS EC2实例上运行的控制台应用程序(或windows服务), 我有一个web服务器(托管MVC3的IIS),当然我有无限多的web客户端 我如何在这些人之间沟通?比方说 我需要每隔几秒钟在网络浏览器中获取一些信息 来自EC2机器-(CPU负载或类似情况) 随需应变 (当用户点击网页上的按钮时)它应该会拉一些东西 所选机器的else(例如C:驱动器上的AvailableDiskSpace) 我应该使用什么-集线器还是Per

我对信号员来说是个新手,所以请原谅我这个愚蠢的问题

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

我如何在这些人之间沟通?比方说

  • 我需要每隔几秒钟在网络浏览器中获取一些信息 来自EC2机器-(CPU负载或类似情况)
  • 随需应变 (当用户点击网页上的按钮时)它应该会拉一些东西 所选机器的else(例如C:驱动器上的AvailableDiskSpace)
  • 我应该使用什么-集线器还是PersistentConnection?在这种情况下,控制台应用程序也将是客户端或自主机(自主机到底是什么?)


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

    您需要使用Hub

    下面是一个如何操作的示例(在0.5.3中):

    服务器端(集线器):

    客户端(javascript):

    希望这有帮助!请随时到我们的JabbR房间与其他人讨论框架:


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

    您将希望使用中心

    下面是一个如何操作的示例(在0.5.3中):

    服务器端(集线器):

    客户端(javascript):

    希望这有帮助!请随时到我们的JabbR房间与其他人讨论框架:


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

    一个问题中有很多问题…:)

    首先,控制台应用程序/windows服务可以是客户端,就像浏览器可以是同一个
    Hub
    。对于这一点,根本没有理由使用
    PersistentConnection
    编程模型

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

  • 如果您需要每隔几秒钟推送一次某个对象的状态,这是一个完美的signer客户端方法。您只需根据从性能计数器接收到的任何通知在客户端上调用该方法。该逻辑可以在中心本身内部,也可以只是来自中心的客户机,该客户机调用一个方法,然后将该方法“扇形”输出到中心的所有其他客户机(建议后者)
  • 对于服务器上的按钮press/get available space场景,您讨论的是几个层。您需要从浏览器向服务器a的中心发送一条消息,以获得您要查找的结果,然后响应浏览器。老实说,这不是完全由信号员解决的。ServerA需要有自己的服务接口,集线器可以调用该接口以获得结果,并能够响应浏览器客户端。然后让浏览器调用hub方法,hub方法将向ServerA发出请求,等待结果,然后将结果返回给浏览器。那里有很多路由工作要做,但没有什么神奇的,也没有什么特定于信号机的。无论出于何种目的,现在都可以在纯web服务体系结构中完成此场景
  • 其次,自主机是指在IIS+ASP.NET以外的主机上托管SignalR服务器。例如,您可以在另一个控制台应用程序或windows服务中启动信号器服务,而不是在IIS+ASP.NET中托管。您可以找到关于自托管的体面文档


    至于信号器示例,老实说,除了一个基本的文档向您展示如何操作之外,您对构建的想法没有什么不同。如果要在IIS+ASP.NET之外托管服务器,您需要为您的控制台应用程序/windows服务、浏览器应用程序和其他应用程序设置主机。

    一个问题中有很多问题…:)

    首先,控制台应用程序/windows服务可以是客户端,就像浏览器可以是同一个
    Hub
    。对于这一点,根本没有理由使用
    PersistentConnection
    编程模型

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

  • 如果您需要每隔几秒钟推送一次某个对象的状态,这是一个完美的signer客户端方法。您只需根据从性能计数器接收到的任何通知在客户端上调用该方法。该逻辑可以在中心本身内部,也可以只是来自中心的客户机,该客户机调用一个方法,然后将该方法“扇形”输出到中心的所有其他客户机(建议后者)
  • 对于服务器上的按钮press/get available space场景,您讨论的是几个层。您需要从浏览器向服务器a的中心发送一条消息,以获得您要查找的结果,然后响应浏览器。老实说,这不是完全由信号员解决的。ServerA需要有自己的服务接口,集线器可以调用该接口以获得结果,并能够响应浏览器客户端。然后让浏览器调用hub方法,hub方法将向ServerA发出请求,等待结果,然后将结果返回给浏览器。那里有很多路由工作要做,但没有什么神奇的,也没有什么特定于信号机的。无论出于何种目的,现在都可以在纯web服务体系结构中完成此场景
  • 其次,自主机是指在IIS+ASP.NET以外的主机上托管SignalR服务器。例如,您可以在另一个控制台应用程序或windows服务中启动信号器服务,而不是在IIS+ASP.NET中托管。您可以找到关于自托管的体面文档

    至于信号器样本,老实说,你的想法没有什么不同
    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
        }
    }
    
    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);
            });
        });
    });