internal Connection(ConnectionManager manager) { _manager = manager; _tracer.WriteMessage("PSW Conn: Creating new connection"); }
internal Connection(ConnectionManager manager) { this._syncObject = new object(); this._instanceId = Guid.NewGuid(); this._tracer = PowerShellTraceSourceFactory.GetTraceSource(); this._structuredTracer = new Tracer(); this._retryInterval = 1; this._manager = manager; this._tracer.WriteMessage("PSW Conn: Creating new connection"); }
private bool ServiceOneRequest(ConnectionManager.RequestInfo requestInfo) { int num; ConcurrentDictionary<Guid, Connection> orAdd; ConcurrentDictionary<Guid, Connection> item; bool flag; string computerName = requestInfo.ConnectionInfo.ComputerName; string shellUri = requestInfo.ConnectionInfo.ShellUri; if (!this._cleanupComputers.ContainsKey(computerName)) { num = 0; ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)1, true); ConcurrentDictionary<string, ConcurrentDictionary<Guid, Connection>> strs = this._connectionPool.GetOrAdd(computerName, new ConcurrentDictionary<string, ConcurrentDictionary<Guid, Connection>>()); num = strs.Keys.Sum<string>((string key) => this.table[key].Count); orAdd = strs.GetOrAdd(shellUri, new ConcurrentDictionary<Guid, Connection>()); ICollection<Connection> values = orAdd.Values; IEnumerator<Connection> enumerator = values.Where<Connection>((Connection connection) => !connection.Busy).Where<Connection>((Connection connection) => ConnectionManager.ValidateConnection(requestInfo, connection)).GetEnumerator(); using (enumerator) { if (enumerator.MoveNext()) { Connection current = enumerator.Current; this._tracer.WriteMessage("PSW ConnMgr: Assigning existing connection to request"); this.AssignConnection(requestInfo, current); ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true); flag = true; } else { goto Label0; } } return flag; } else { return false; } Label0: if (num >= this._maxOutBoundConnections) { Connection connection1 = null; IEnumerator<string> enumerator1 = strs.Keys.GetEnumerator(); using (enumerator1) { do { if (!enumerator1.MoveNext()) { break; } string str = enumerator1.Current; item = strs[str]; ICollection<Connection> connections = item.Values; connection1 = connections.Where<Connection>((Connection connection) => !connection.Busy).FirstOrDefault<Connection>(); } while (connection1 == null); } if (connection1 != null) { if (!ConnectionManager.ValidateConnection(requestInfo, connection1)) { item.TryRemove(connection1.InstanceId, out connection1); this._tracer.WriteMessage("PSW ConnMgr: Closing potential connection and creating a new one to service request"); ConnectionManager connectionManager = this; connectionManager._createdConnections = connectionManager._createdConnections - 1; Connection connection2 = this.CreateConnection(requestInfo, orAdd); ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 29, (long)1, true); this.SubmitOperation(new CloseOneAndOpenAnotherOperation(connection1, connection2)); ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true); return true; } else { this._tracer.WriteMessage("PSW ConnMgr: Assigning potential connection to service request"); this.AssignConnection(requestInfo, connection1); ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true); return true; } } else { ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true); return false; } } else { this._tracer.WriteMessage("PSW ConnMgr: Creating new connection to service request"); Connection connection3 = this.CreateConnection(requestInfo, orAdd); this.SubmitOperation(new OpenOperation(connection3)); ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 25, (long)-1, true); return true; } }
private Connection CreateConnection(ConnectionManager.RequestInfo requestInfo, ConcurrentDictionary<Guid, Connection> connections) { Connection connection = new Connection(this); connection.ConnectionInfo = requestInfo.ConnectionInfo; connection.RetryCount = requestInfo.RetryCount; connection.RetryInterval = requestInfo.RetryInterval; connection.RetryAttempt = 0; connection.AsyncResult = requestInfo.AsyncResult; connection.Busy = true; Connection connection1 = connection; connections.TryAdd(connection1.InstanceId, connection1); ConnectionManager connectionManager = this; connectionManager._createdConnections = connectionManager._createdConnections + 1; ConnectionManager._perfCountersMgr.UpdateCounterByValue(PSWorkflowPerformanceCounterSetInfo.CounterSetId, 27, (long)1, true); return connection1; }
private void AssignConnection(ConnectionManager.RequestInfo requestInfo, Connection connection) { IAsyncResult asyncResult = requestInfo.AsyncResult; GetRunspaceAsyncResult getRunspaceAsyncResult = asyncResult as GetRunspaceAsyncResult; connection.Busy = true; connection.AsyncResult = getRunspaceAsyncResult; getRunspaceAsyncResult.Connection = connection; this.AddToPendingCallback(getRunspaceAsyncResult); }
private static bool ValidateConnection(ConnectionManager.RequestInfo requestInfo, Connection connection) { if (connection.Runspace.RunspaceStateInfo.State == RunspaceState.Opened) { WSManConnectionInfo connectionInfo = requestInfo.ConnectionInfo; WSManConnectionInfo originalConnectionInfo = connection.Runspace.OriginalConnectionInfo as WSManConnectionInfo; if (originalConnectionInfo != null) { if (WorkflowUtils.CompareConnectionUri(connectionInfo, originalConnectionInfo)) { if (WorkflowUtils.CompareShellUri(connectionInfo.ShellUri, originalConnectionInfo.ShellUri)) { if (WorkflowUtils.CompareAuthentication(connectionInfo.AuthenticationMechanism, originalConnectionInfo.AuthenticationMechanism)) { if (WorkflowUtils.CompareCredential(connectionInfo.Credential, originalConnectionInfo.Credential)) { if (WorkflowUtils.CompareCertificateThumbprint(connectionInfo.CertificateThumbprint, originalConnectionInfo.CertificateThumbprint)) { if (WorkflowUtils.CompareProxySettings(connectionInfo, originalConnectionInfo)) { if (WorkflowUtils.CompareOtherWSManSettings(connectionInfo, originalConnectionInfo)) { if (originalConnectionInfo.IdleTimeout >= connectionInfo.IdleTimeout) { return true; } else { return false; } } else { return false; } } else { return false; } } else { return false; } } else { return false; } } else { return false; } } else { return false; } } else { return false; } } else { return false; } } else { return false; } }