首页 > 解决方案 > Hubproxy.On 长时间不触发

问题描述

我有一个使用 SignalR HubConnection 的 wpf 应用程序。一切都按预期工作。但是在很长一段时间(例如 10 小时)之后 hubproxy.on 方法没有触发,服务器正确地向客户端发送数据也 hubproxy.Invoke 工作正常,只有 hubproxy.On 不起作用。没有连接错误或断开状态。它发生在生产环境中

这是我的客户代码

 public partial class MainWindow : Window
        {
            private IHubProxy hubProxy;
            private HubConnection connection;
            private string url = "http://localhost:8080/signalr";

        public MainWindow()
        {
            InitializeConnection();
            InitializeComponent();
        }

        private void InitializeConnection()
        {
            connection = new HubConnection(url);
            hubProxy = connection.CreateHubProxy("SignalRHub");
            connection.StateChanged += connection_StateChanged;
            hubProxy.On<string>("OnMessage", OnMMessage);
            connection.Start();
        }

        void connection_StateChanged(StateChange obj)
        {
            if (obj.NewState == ConnectionState.Disconnected)
            {
                InitializeConnection();
            }
        }

        private void OnMMessage(string message)
        {
            //This not works sometimes
            MessageBox.Show(message);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //this works always, is being logged on the server
            hubProxy.Invoke("SendMessage2", new object[1] { "dfdfdf" });
        }
    }

这是服务器端

public class SignalRHub : Hub
{
    public Logger logger = new Logger();
    public void Subscribe()
    {
        SubscriberCache.Subscribers.Add(Context.ConnectionId);
    }

    public void UnSubscribe()
    {
        if (SubscriberCache.Subscribers.Contains(Context.ConnectionId))
            SubscriberCache.Subscribers.Remove(Context.ConnectionId);
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        UnSubscribe();
        return base.OnDisconnected(stopCalled);
    }

    public override Task OnReconnected()
    {
        if (!SubscriberCache.Subscribers.Contains(Context.ConnectionId))
            SubscriberCache.Subscribers.Add(Context.ConnectionId);

        return base.OnReconnected();
    }

    public void SendMessage(string message)
    {
        //this works always
        logger.Info("message sending to client");
        Clients.All.OnMessage(message);

    }
}

标签: c#wpfsignalr

解决方案


推荐阅读