Ejemplo n.º 1
0
        /// <summary>
        /// Размещение объекта c использованием имени объекта и порта, определяемых пользователем
        /// </summary>
        /// <param name="objectName">Имя объекта</param>
        /// <param name="port">Порт</param>
        public void Marshal(string objectName, int port)
        {
            CheckCustomErrors();

            // регистрируем трэкер
            IpFixTrackingHandler.RegisterTracker(_eventLink);

            // создаем провайдера для приемников, отвечающего за форматирование сообщения
            IServerFormatterSinkProvider formatterSinkProvider = CreateFormatterSinkProvider();

            // создаем провайдера для приемников, принимающих имя серверного хоста
            // или его IP-адрес, видимые с клиента
            IpFixServerChannelSinkProvider customSinkProvider = new IpFixServerChannelSinkProvider();

            customSinkProvider.EventLink = _eventLink;
            // связываем провайдеров в цепь
            customSinkProvider.Next = formatterSinkProvider;

            // создаем серверный канал
            _channel = CreateChannel(port, customSinkProvider, GetChannelName("server"));
            ChannelServices.RegisterChannel(_channel, false);

            // размещаем объект
            _targetRef = RemotingServices.Marshal(_target, objectName);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Adds a specified server sink provider into the server sink chain after the formatter.
        /// </summary>
        /// <param name="protocolSetup">Protocol setup</param>
        /// <param name="serverSinkProvider">Server sink provider to be added</param>
        /// <returns>Protocol setup</returns>
        public static IServerProtocolSetup AddServerSinkAfterFormatter(this IServerProtocolSetup protocolSetup, IServerChannelSinkProvider serverSinkProvider)
        {
            if (protocolSetup == null)
            {
                throw new ArgumentNullException("protocolSetup");
            }

            if (serverSinkProvider == null)
            {
                throw new ArgumentNullException("serverSinkProvider");
            }

            IServerFormatterSinkProvider formatter = GetServerFormatter(protocolSetup);

            if (formatter == null)
            {
                throw new ApplicationException(LanguageResource.ApplicationException_NoFormatterSpecified);
            }

            int index = protocolSetup.ServerSinkChain.IndexOf((IServerChannelSinkProvider)formatter);

            protocolSetup.ServerSinkChain.Insert(index + 1, serverSinkProvider);

            return(protocolSetup);
        }
Ejemplo n.º 3
0
        internal static IpcChannel RegisterIpcChannel(string name, string remoteRuntimeChannelName, IServerFormatterSinkProvider sinkProvider)
        {
            IpcChannel channel = CreateChannel(name, remoteRuntimeChannelName, sinkProvider);

            ChannelServices.RegisterChannel(channel, false);
            return(channel);
        }
Ejemplo n.º 4
0
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2116:AptcaMethodsShouldOnlyCallAptcaMethods")] // TODO: Microsoft.Scripting does not need to be APTCA
        internal static IpcChannel CreateChannel(string channelName, string portName, IServerFormatterSinkProvider sinkProvider)
        {
            // The Hosting API classes require TypeFilterLevel.Full to be remoted
            var serverProv = sinkProvider;

            System.Collections.IDictionary properties = new Hashtable();
            properties["name"]            = channelName;
            properties["portName"]        = portName;
            properties["includeVersions"] = false;
            // exclusiveAddressUse corresponds to the FILE_FLAG_FIRST_PIPE_INSTANCE flag of CreateNamedPipe.
            // Setting it to true seems to cause "Failed to create an IPC Port: Access is denied." occasionally.
            // TODO: Setting this to false is secure only if we use ACLs as well.
            properties["exclusiveAddressUse"] = false;

            // Create the channel.
            return(new IpcChannel(properties, null, serverProv));
        }
        /// <summary>
        /// Erzeugt einen fertig konfigurierten Remoting-Kanal.
        /// <remarks>
        /// Wenn der Kanal in der aktuellen Anwendungsdomäne bereits registriert wurde, wird null zurückgegeben.
        /// </remarks>
        /// </summary>
        /// <returns>Remoting Kanal</returns>
        public IChannel CreateChannel()
        {
            // Kanal suchen
            IChannel channel = ChannelServices.GetChannel(_channelName);

            // Wenn der Kanal nicht gefunden wurde ...
            if (channel == null)
            {
                // Konfiguration für den HTTP-Kanal erstellen
                System.Collections.IDictionary channelSettings = new System.Collections.Hashtable();
                channelSettings["name"] = _channelName;
                channelSettings["port"] = 0;

                // Variable für Clientformatierer
                IClientFormatterSinkProvider clientFormatter = null;

                // Wenn binäre Formatierung verwendet werden soll ...
                if (_useBinaryFormatter)
                {
                    // Binären Clientformatierer erzeugen
                    clientFormatter = new BinaryClientFormatterSinkProvider();
                }
                else
                {
                    // SOAP Clientformatierer erzeugen
                    clientFormatter = new SoapClientFormatterSinkProvider();
                }

                // Wenn die Kommunikation verschlüsselt werden soll ...
                if (_encryption)
                {
                    // Client-Verschlüsselungs-Kanalsenkenanbieter erzeugen
                    CryptoClientChannelSinkProvider clientEncryption = new CryptoClientChannelSinkProvider();

                    // Verschlüsselung konfigurieren
                    clientEncryption.Algorithm   = _algorithm;
                    clientEncryption.Oaep        = _oaep;
                    clientEncryption.MaxAttempts = _maxAttempts;

                    // Verschlüsselungs-Kanalsenkenanbieter hinter den Formatierer hängen
                    clientFormatter.Next = clientEncryption;
                }
                // Variable für ersten Server-Senkenanbieter in der Kette
                IServerChannelSinkProvider firstServerSinkProvider = null;

                // Variable für Serverformatierer
                IServerFormatterSinkProvider serverFormatter = null;

                // Wenn binäre Formatierung verwendet werden soll ...
                if (_useBinaryFormatter)
                {
                    // Binären Serverformatierer erzeugen
                    serverFormatter = new BinaryServerFormatterSinkProvider();

                    // Serialisierung von komplexen Objekten aktivieren
                    ((BinaryServerFormatterSinkProvider)serverFormatter).TypeFilterLevel = TypeFilterLevel.Full;
                }
                else
                {
                    // SOAP Serverformatierer erzeugen
                    serverFormatter = new SoapServerFormatterSinkProvider();

                    // Serialisierung von komplexen Objekten aktivieren
                    ((SoapServerFormatterSinkProvider)serverFormatter).TypeFilterLevel = TypeFilterLevel.Full;
                }
                // Wenn die Kommunikation verschlüsselt werden soll ...
                if (_encryption)
                {
                    // Server-Verschlüsselungs-Kanalsenkenanbieter erzeugen
                    CryptoServerChannelSinkProvider serverEncryption = new CryptoServerChannelSinkProvider();

                    // Verschlüsselung konfigurieren
                    serverEncryption.Algorithm           = _algorithm;
                    serverEncryption.Oaep                = _oaep;
                    serverEncryption.RequireCryptoClient = true;

                    // Formatierer hinter den Verschlüsselungs-Kanalsenkenanbieter hängen
                    serverEncryption.Next = serverFormatter;

                    // Verschlüsselungs-Kanalsenkenanbieter als ersten Senkenanbieter festlegen
                    firstServerSinkProvider = serverEncryption;
                }
                else
                {
                    // Server-Formatierer als ersten Senkenanbieter festlegen
                    firstServerSinkProvider = serverFormatter;
                }

                // Neuen HTTP-Kanal erzeugen
                channel = new HttpChannel(channelSettings, clientFormatter, firstServerSinkProvider);

                // Wenn Zyan nicht mit mono ausgeführt wird ...
                if (!MonoCheck.IsRunningOnMono)
                {
                    // Sicherstellen, dass vollständige Ausnahmeinformationen übertragen werden
                    if (RemotingConfiguration.CustomErrorsMode != CustomErrorsModes.Off)
                    {
                        RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
                    }
                }
                // Kanal zurückgeben
                return(channel);
            }
            // Nichts zurückgeben
            return(null);
        }
Ejemplo n.º 6
0
        internal static IpcChannel RegisterIpcChannel(string name, string remoteRuntimeChannelName, IServerFormatterSinkProvider sinkProvider)
        {
            IpcChannel channel = CreateChannel(name, remoteRuntimeChannelName, sinkProvider);

            ChannelServices.RegisterChannel(channel, false);
            return channel;
        }
Ejemplo n.º 7
0
        internal static IpcChannel CreateChannel(string channelName, string portName, IServerFormatterSinkProvider sinkProvider)
        {
            // The Hosting API classes require TypeFilterLevel.Full to be remoted
            var serverProv = sinkProvider;
            System.Collections.IDictionary properties = new Hashtable();
            properties["name"] = channelName;
            properties["portName"] = portName;
            properties["includeVersions"] = false;
            // exclusiveAddressUse corresponds to the FILE_FLAG_FIRST_PIPE_INSTANCE flag of CreateNamedPipe.
            // Setting it to true seems to cause "Failed to create an IPC Port: Access is denied." occasionally.
            // TODO: Setting this to false is secure only if we use ACLs as well.
            properties["exclusiveAddressUse"] = false;

            // Create the channel.
            return new IpcChannel(properties, null, serverProv);
        }