【问题标题】:asp.net core with signalR < - > static socket带有signalR <->静态套接字的asp.net核心
【发布时间】:2018-06-02 20:00:11
【问题描述】:

用例: 我有一个带有用于消息传递的 signalR 核心的 asp.net 核心 Web 应用程序。 :)

问题: 我必须从套接字连接接收消息 [通过 System.Net.Sockets](具有自己的套接字通信的机器)

有没有办法将套接字客户端集成到 Web 应用程序中(可能是 Progamm.cs 或 Startup.cs?) 以及如何访问 signalR 以将收到的消息转发到 signalR Hub?

谢谢

【问题讨论】:

    标签: sockets static signalr .net-core asp.net-core-2.0


    【解决方案1】:

    我建议您阅读股票报价单示例:https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-server-broadcast-with-signalr

    我在这里向您展示了一个小示例,您可以根据自己的应用进行调整。您必须从自己的套接字通信中订阅消息,然后才能将此消息转发给连接的客户端。

    这是一个如何将时间从服务器发送到客户端的小示例。 (对您来说有趣的部分是 GlobalHost.ConnectionManager.GetHubContext&lt;ClockHub&gt;().Clients.All.sendTime(DateTime.UtcNow.ToString()); 行。您可以将其发送给所有连接的客户端。

    我的主类是一个时钟,它向所有连接的客户端发送实际时间:

    public class Clock
    {
        private static Clock _instance;
        private Timer timer;
        private Clock()
        {
            timer = new Timer(200);
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
        }
    
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        { // ---> This is the important part for you: Get hubContext where ever you use it and call method on hub             GlobalHost.ConnectionManager.GetHubContext<ClockHub>().Clients.All.sendTime(DateTime.UtcNow.ToString());
            GlobalHost.ConnectionManager.GetHubContext<ClockHub>().Clients.Clients()
        }
    
        public static Clock Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Clock();
                }
                return _instance;
            }
        }
    }
    

    }

    在启动时,我创建了这个时钟的一个 sigleton 实例,只要应用程序运行,它就会一直存在。

      public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                var inst = Clock.Instance;
                app.UseCors(CorsOptions.AllowAll);
                app.MapSignalR();         
            }
        }
    }
    

    我的中心:

      public class ClockHub : Hub<IClockHub>
        {
    
        }
    

    Hub接口,定义了服务器可以调用的方法:

     public interface IClockHub
        {
            void sendTime(string actualTime);
        }
    

    这是客户端部分:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8" />
    </head>
    <body>
        <div id="timeLabel" ></div>
        <script src="scripts/jquery-1.6.4.min.js"></script>
        <script src="scripts/jquery.signalR-2.2.0.js"></script>
        <script src="signalr/hubs"></script>
        <script>
            $(function () { // I use jQuery in this example
                var ticker = $.connection.clockHub;
                function init() {
                }
                ticker.client.sendTime = function (h) {
                    $("#timeLabel").html(h);
                }
                $.connection.hub.start().done(init);
            });
        </script>
    </body>
    </html>
    

    如何在 asp.net core 2.x 中注入 hubcontext Call SignalR Core Hub method from Controller

    【讨论】:

    • 与asp.net core不兼容! GlobalHost.ConnectionManager.GetHubContext.... SignalR 核心目前不存在。 :/ 我找到了另一个解决方案,使用 GlobalHost 的 IConnectionManager 即时,但 IConnectionManager 在信号器核心框架中也不存在。
    • @Hannes 你没有在你的问题中写下这个。我更新了我的答案
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多