/// <summary> /// Wird vom Zeitgeber aufgerufen, wenn die Sitzung verlängert werden soll. /// </summary> /// <param name="state">Statusobjekt</param> private void KeepSessionAlive(object state) { try { // Aufrufkontext vorbereiten PrepareCallContext(false); // Sitzung erneuern int serverSessionAgeLimit = RemoteComponentFactory.RenewSession(); // Wenn der Wert für die Sitzungslebensdauer auf dem Server in der Zwischenzeit geändert wurde ... if (_sessionAgeLimit != serverSessionAgeLimit) { // Neuen Wert für Sitzungslebendauer speichern _sessionAgeLimit = serverSessionAgeLimit; // Zeitgeber neu starten StartKeepSessionAliveTimer(); } } catch { } }
private static void RunRemoteComponent(CompositionCommandInfo info, XmlProcessingContext xmlProcessingContext) { if (!(info is RemoteComponentInfo remoteComponentInfo)) { throw new ArgumentException("Invalid runner input type: error in static setup."); } // Extract and load contract type var contractType = SimpleTypeParserUtil.ParseType(remoteComponentInfo.ContractType, xmlProcessingContext); if (contractType == null) { xmlProcessingContext.ReportError( $"Type '{remoteComponentInfo.ContractType}' could not be loaded."); return; } // Get contract name var contractName = remoteComponentInfo.ContractName; // Create end point address var serverAddress = remoteComponentInfo.ServerAddress ?? (string) xmlProcessingContext.ComponentContext.GetVariable(remoteComponentInfo.ServerAddressVariableName); var spnIdentity = remoteComponentInfo.SpnIdentity ?? contractType.Name; var endpointAddress = new EndpointAddress( new Uri(serverAddress), EndpointIdentity.CreateSpnIdentity(spnIdentity)); // Create binding var securityMode = (SecurityMode)Enum.Parse( typeof(SecurityMode), remoteComponentInfo.SecurityMode ?? "None", true); var binding = new NetTcpBinding(securityMode) { MaxBufferSize = (remoteComponentInfo.MaxBufferSizeNullable.HasValue ? remoteComponentInfo.MaxBufferSize : 16777216), MaxReceivedMessageSize = (remoteComponentInfo.MaxReceivedMessageSizeNullable.HasValue ? remoteComponentInfo.MaxReceivedMessageSize : 16777216) }; // Extract list of known types List <Type> knownTypes = null; if (!string.IsNullOrEmpty(remoteComponentInfo.KnownTypesVariableName)) { knownTypes = xmlProcessingContext.ComponentContext.GetVariable(remoteComponentInfo.KnownTypesVariableName) as List <Type>; } // Build ComponentConfiguration var componentFactory = new RemoteComponentFactory { Address = endpointAddress, Binding = binding, ContractType = contractType, KnownTypes = knownTypes }; // Register the component into the component context. xmlProcessingContext.ComponentContext.Register(contractType, contractName, componentFactory); }
/// <summary> /// Konstruktor. /// </summary> /// <param name="serverUrl">Server-URL (z.B. "tcp://server1:46123/ebcserver")</param> /// <param name="protocolSetup">Protokoll-Einstellungen</param> /// <param name="credentials">Anmeldeinformationen</param> /// <param name="autoLoginOnExpiredSession">Gibt an, ob sich der Proxy automatisch neu anmelden soll, wenn die Sitzung abgelaufen ist</param> /// <param name="keepSessionAlive">Gib an, ob die Sitzung automatisch verlängert werden soll</param> public ZyanConnection(string serverUrl, IClientProtocolSetup protocolSetup, Hashtable credentials, bool autoLoginOnExpiredSession, bool keepSessionAlive) { // Wenn kein Server-URL angegeben wurde ... if (string.IsNullOrEmpty(serverUrl)) { // Ausnahme werfen throw new ArgumentException(LanguageResource.ArgumentException_ServerUrlMissing, "serverUrl"); } // Wenn keine Protokoll-Einstellungen angegeben wurde ... if (protocolSetup == null) { // Ausnahme werfen throw new ArgumentNullException("protocolSetup"); } // Protokoll-Einstellungen übernehmen _protocolSetup = protocolSetup; // Eindeutigen Sitzungsschlüssel generieren _sessionID = Guid.NewGuid(); // Server-URL übernehmen _serverUrl = serverUrl; // Einstellung für automatisches Anmelden bei abgelaufener Sitzung übernehmen _autoLoginOnExpiredSession = autoLoginOnExpiredSession; // Einstellung für automatische Sitzungsverlängung übernehmen _keepSessionAlive = keepSessionAlive; // Wenn automatisches Anmelden aktiv ist ... if (_autoLoginOnExpiredSession) { // Anmeldedaten speichern _autoLoginCredentials = credentials; } // Server-URL in Bestandteile zerlegen string[] addressParts = _serverUrl.Split('/'); // Name des Komponentenhots speichern _componentHostName = addressParts[addressParts.Length - 1]; // TCP-Kommunikationskanal öffnen IChannel channel = (IChannel)_protocolSetup.CreateChannel(); // Wenn der Kanal erzeugt wurde ... if (channel != null) { // Kanal registrieren ChannelServices.RegisterChannel(channel, false); } // Wörterbuch für Benachrichtigungs-Registrierungen erzeugen _subscriptions = new Dictionary <Guid, NotificationReceiver>(); // Wenn leere Anmeldeinformationen angegben wurden ... if (credentials != null && credentials.Count == 0) { // Auflistung löschen credentials = null; } // Am Server anmelden RemoteComponentFactory.Logon(_sessionID, credentials); // Registrierte Komponenten vom Server abrufen _registeredComponents = new List <ComponentInfo>(RemoteComponentFactory.GetRegisteredComponents()); // Sitzungslimit abrufen _sessionAgeLimit = RemoteComponentFactory.SessionAgeLimit; // Zeitgeber starten (Wenn die automatische Sitzungsverlängerung aktiv ist) StartKeepSessionAliveTimer(); // Verbindung der Auflistung zufügen _connections.Add(this); }