【问题标题】:Signalr .Net Client Console application receive messages from hub only onceSignalr .Net 客户端控制台应用程序仅从集线器接收消息一次
【发布时间】:2017-04-14 08:57:21
【问题描述】:

我在我的控制台应用程序中使用 Signalr .Net 客户端从 Signalr Hub 接收消息,这是一个单独的 Web 应用程序。

我的控制台应用程序正确连接到集线器,并且仅从集线器接收消息一次。然后 Signalr .Net 客户端中的客户端方法没有被调用。

一旦我停止控制台应用程序并运行它,它就会再次从集线器收到一条消息,但没有任何反应。

这是我的中心代码

public override Task OnConnected()
        {
            try
            {
                 var cType = Context.QueryString["type"];
                var connectionId = Context.ConnectionId;
                var connectedUserList = (from d in Users
                                         where d.ClientType == cType
                                                          select d).ToList();
                if (connectedUserList.Count > 0)
                {
                    var conUser = connectedUserList.First<ConnectedUsers>();
                    conUser.ConnectionIds.Add(connectionId);
                }
                else
                {
                    var newUser = new ConnectedUsers
                    {
                        ConnectionIds = new HashSet<string> {connectionId}
                       ,
                        ClientType = cType
                    };
                    Users.Add(newUser);
                }
            }
            catch (Exception ex)
            {

           ).Error(ex);
            }
            return base.OnConnected();
        }

和我的 .Net 客户端连接

static  void Main(string[] args)
        {

            SignalrHandler();
            Console.ReadLine();

        }

        public static async void SignalrHandler()
        {
            var url = ConfigurationSettings.AppSettings["Url"] ?? @"http://localhost:1010/";
            var querystringData = new Dictionary<string, string> { { "type", "WIN" } };
            _hubConnection = new HubConnection(url, querystringData);
            MarcolinMainProxy = _hubConnection.CreateHubProxy("MainHub");
            MarcolinMainProxy.On<string>("sendAlert", type => InvokeMethod(type));    
           await _hubConnection.Start();

        }

客户端方法

private static void InvokeMethod(string type)
        {
            Console.WriteLine(String.Format("Recieved Message From Server On :{0}",System.DateTime.Now.ToString()));
            Console.WriteLine("Message Received");

            Console.ReadLine();


        }

当我使用带有以下行的 Invoke 方法时会发生这种情况

MarcolinMainProxy.On<string>("sendAlert", type => InvokeMethod(type));

当我使用以下行时,它可以工作..

MarcolinMainProxy.On<string>("sendAlert", stock => Console.WriteLine("Symbol {0} Price {1}", "sd", "sdde"));

【问题讨论】:

  • 在调用SignalrHandler方法后放一条调试信息,看看代码执行是否通过,可能没有阻塞,一直在等待新消息,所以代码第一次监听然后应用程序结束
  • @HaithamShaddad 我已经更新了这个问题。我认为问题出在客户端调用方法上。
  • 那么,当您保持代码内联时它可以工作,但如果您调用InvokeMethod 方法则不起作用?
  • 是的。当我使用内联代码时它可以工作
  • 看看这个链接,基本上可以不用lamda表达式直接传方法名,例如:MarcolinMainProxy.On&lt;string&gt;("sendAlert", InvokeMethod); damienbod.com/2013/11/13/…

标签: asp.net-mvc signalr signalr.client signalr.net-client


【解决方案1】:

查看以下链接

https://damienbod.com/2013/11/13/signalr-messaging-a-complete-client-with-a-console-application/

您必须将代码更改为

MarcolinMainProxy.On<string>("sendAlert", InvokeMethod);

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 2021-12-22
    • 2021-10-18
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多