private async Task DirectConnectionJoinGroup(string connectionString) { var serviceManager = new ServiceManagerBuilder().WithOptions(option => { option.ConnectionString = connectionString; option.ServiceTransportType = ServiceTransportType.Transient; }).Build(); var hubContext = await serviceManager.CreateHubContextAsync(SignalRConstants.DefaultRestHubName); var connectionCount = _connections.Count; if (connectionCount >= _groupCount) { for (var i = 0; i < _connections.Count; i++) { var userId = SignalRUtils.GenClientUserIdFromConnectionIndex(_connectionIndex[i]); try { await hubContext.UserGroups.AddToGroupAsync( userId, SignalRUtils.GroupName(_type, _connectionIndex[i] % _groupCount)); _statisticsCollector.IncreaseJoinGroupSuccess(); } catch (Exception e) { _statisticsCollector.IncreaseJoinGroupFail(); Log.Error($"Fail to join group: {e.Message}"); } } } else { for (var i = 0; i < _groupCount; i++) { var userId = SignalRUtils.GenClientUserIdFromConnectionIndex(i); try { await hubContext.UserGroups.AddToGroupAsync( userId, SignalRUtils.GroupName(_type, i)); _statisticsCollector.IncreaseJoinGroupSuccess(); } catch (Exception e) { _statisticsCollector.IncreaseJoinGroupFail(); Log.Error($"Fail to join group: {e.Message}"); } } } }
protected virtual async Task JoinLeaveGroup(int localIndex, IDictionary <string, object> data) { // Extract data data.TryGetTypedValue(SignalRConstants.GroupName, out string groupName, Convert.ToString); data.TryGetTypedValue(_isIngroup, out bool isInGroup, Convert.ToBoolean); // Join or leave groups if (isInGroup) { try { await Connections[localIndex].SendAsync(SignalRConstants.LeaveGroupCallbackName, groupName); } catch { StatisticsCollector.IncreaseLeaveGroupFail(); } } else { try { await Connections[localIndex].SendAsync(SignalRConstants.JoinGroupCallbackName, groupName); } catch { StatisticsCollector.IncreaseJoinGroupFail(); } } data[_isIngroup] = !isInGroup; }
public static async Task JoinToGroup( IHubConnectionAdapter connection, string groupName, StatisticsCollector statisticsCollector) { try { await connection.SendAsync(SignalRConstants.JoinGroupCallbackName, groupName); } catch { statisticsCollector.IncreaseJoinGroupFail(); } }