示例#1
0
        /// <summary>
        /// Start the hub connection - populate FunctionNamesToFullNames first
        /// </summary>
        /// <returns></returns>
        public async Task StartAsync()
        {
            // stop any previous hub connection
            hubConnection?.Stop();
            hubConnection?.Dispose();

            // make a new hub connection
            hubConnection         = new HubConnection(ConnectionUrl, false);
            hubConnection.Closed += SocketClosed;

#if DEBUG
            //hubConnection.TraceLevel = TraceLevels.All;
            //hubConnection.TraceWriter = Console.Out;
#endif

            hubProxy = hubConnection.CreateHubProxy(HubName);
            if (hubProxy == null)
            {
                throw new APIException("CreateHubProxy - proxy is null, this should never happen");
            }

            // assign callbacks for events
            foreach (string key in FunctionNamesToFullNames.Keys)
            {
                hubProxy.On(key, async(string data) => await HandleResponse(key, data));
            }

            // create a custom transport, the default transport is really buggy
            DefaultHttpClient        client          = new DefaultHttpClient();
            WebsocketCustomTransport customTransport = new WebsocketCustomTransport(client);
            var autoTransport = new AutoTransport(client, new IClientTransport[] { customTransport });
            hubConnection.TransportConnectTimeout = hubConnection.DeadlockErrorTimeout = TimeSpan.FromSeconds(10.0);

            // setup connect event
            customTransport.WebSocket.Connected += async(ws) =>
            {
                SignalrSocketConnection[] socketsCopy;
                lock (sockets)
                {
                    socketsCopy = sockets.ToArray();
                }
                foreach (SignalrSocketConnection socket in socketsCopy)
                {
                    await socket.InvokeConnected();
                }
            };

            // setup disconnect event
            customTransport.WebSocket.Disconnected += async(ws) =>
            {
                try
                {
                    SignalrSocketConnection[] socketsCopy;
                    lock (sockets)
                    {
                        socketsCopy = sockets.ToArray();
                    }
                    foreach (SignalrSocketConnection socket in socketsCopy)
                    {
                        await socket.InvokeDisconnected();
                    }
                }
                catch (Exception ex)
                {
                    Logger.Info(ex.ToString());
                }
                // start a task to tear down the hub connection
                await Task.Run(() =>
                {
                    try
                    {
                        // tear down the hub connection, we must re-create it whenever a web socket disconnects
                        hubConnection?.Dispose();
                    }
                    catch (Exception ex)
                    {
                        Logger.Info(ex.ToString());
                    }
                });
            };
            await hubConnection.Start(autoTransport);

            // get list of listeners quickly to limit lock
            HubListener[] listeners;
            lock (this.listeners)
            {
                listeners = this.listeners.Values.ToArray();
            }

            // re-call the end point to enable messages
            foreach (var listener in listeners)
            {
                foreach (object[] p in listener.Param)
                {
                    await hubProxy.Invoke <bool>(listener.FunctionFullName, p);
                }
            }
        }
示例#2
0
        /// <summary>
        /// Start the hub connection - populate FunctionNamesToFullNames first
        /// </summary>
        /// <returns></returns>
        public async Task StartAsync()
        {
            // stop any previous hub connection
            hubConnection?.Stop();
            hubConnection?.Dispose();

            // make a new hub connection
            hubConnection         = new HubConnection(ConnectionUrl, false);
            hubConnection.Closed += SocketClosed;

            ///TODO:正式发布注释代码
            #region 测试 输入signalr日志
            hubConnection.TraceLevel  = TraceLevels.All;
            hubConnection.TraceWriter = Console.Out;
            #endregion

            hubConnection.StateChanged   += StateChange;
            hubConnection.ConnectionSlow += ConnectionSlow;
            hubConnection.Error          += Error;
            //hubConnection.Received += Received;

            hubProxy = hubConnection.CreateHubProxy(HubName);

            // assign callbacks for events
            foreach (string key in FunctionNamesToFullNames.Keys)
            {
                hubProxy.On(key, (string data) => HandleResponse(key, data));
            }

            // create a custom transport, the default transport is really buggy
            DefaultHttpClient client = new DefaultHttpClient();
            customTransport = new WebsocketCustomTransport(client);
            var autoTransport = new AutoTransport(client, new IClientTransport[] { customTransport });
            hubConnection.TransportConnectTimeout = hubConnection.DeadlockErrorTimeout = TimeSpan.FromSeconds(10.0);

            // setup connect event
            customTransport.WebSocket.Connected += (ws) =>
            {
                lock (sockets)
                {
                    foreach (IWebSocket socket in sockets)
                    {
                        (socket as SignalrSocketConnection).InvokeConnected();
                    }
                }
            };

            // setup disconnect event
            customTransport.WebSocket.Disconnected += (ws) =>
            {
                lock (sockets)
                {
                    foreach (IWebSocket socket in sockets)
                    {
                        (socket as SignalrSocketConnection).InvokeDisconnected();
                    }
                }

                // start a task to tear down the hub connection
                Task.Run(() =>
                {
                    try
                    {
                        // tear down the hub connection, we must re-create it whenever a web socket disconnects
                        hubConnection?.Dispose();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"hubConnection dispose error: {ex.Message}");
                    }
                });
            };
            await hubConnection.Start(autoTransport);

            // get list of listeners quickly to limit lock
            HubListener[] listeners;
            lock (this.listeners)
            {
                listeners = this.listeners.Values.ToArray();
            }

            // re-call the end point to enable messages
            foreach (var listener in listeners)
            {
                foreach (string[] p in listener.Param)
                {
                    await hubProxy.Invoke <bool>(listener.FunctionFullName, p);
                }
            }
        }