public ScenarioSession SetupScenario(string userSubject, int id) { _logger.Info($"{nameof(SetupScenario)}({userSubject}, {id})"); try { if (!_scenarios.ContainsKey(id)) { throw new ArgumentOutOfRangeException(nameof(id)); } if (_activeScenarios.TryRemove(userSubject, out ScenarioMonitoringData scenarioMonitoringData)) { AbandonScenario(userSubject, scenarioMonitoringData.ScenarioId); } ScenarioDefinition scenarioDefinition = _scenarios[id]; long scenarioSessionId = _dataAccessService.AddNewScenarionSession(userSubject, id); _dataAccessService.UpdateScenarioSessionStep(scenarioSessionId, 1); ScenarioSession scenarioSession = _dataAccessService.GetScenarioSession(scenarioSessionId); scenarioMonitoringData = new ScenarioMonitoringData { ScenarioId = id, ScenarioSessionId = scenarioSessionId, ActivationTime = scenarioSession.StartTime, LastUseTime = DateTime.UtcNow }; _activeScenarios.AddOrUpdate(userSubject, scenarioMonitoringData, (k, v) => scenarioMonitoringData); SetupIdentityProviders(scenarioDefinition, scenarioSessionId); SetupServiceProviders(scenarioDefinition, scenarioSessionId); SetupUsers(scenarioDefinition, scenarioSessionId); return(scenarioSession); } catch (Exception ex) { _logger.Error($"Failed {nameof(ResumeScenario)}({userSubject}, {id})", ex); throw; } }