Example #1
0
        /// <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);
        }
Example #3
0
        /// <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);
        }