コード例 #1
0
        /// <summary>
        /// Gets a specified registered Zyan transport adapter.
        /// </summary>
        /// <param name="adapterName">Unique adapter name</param>
        /// <returns>Registered transport adapter</returns>
        public IClientTransportAdapter GetTransportAdapter(string adapterName)
        {
            IClientTransportAdapter adapter = null;

            _transportAdapters.TryGetValue(adapterName, out adapter);
            return(adapter);
        }
コード例 #2
0
        /// <summary>
        ///Unregisters a Zyan transport adapter.
        /// </summary>
        /// <param name="adapter">Transport adapter</param>
        public void Unregister(IClientTransportAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException("adapter");
            }

            IServerTransportAdapter removedAdapter;

            _transportAdapters.TryRemove(adapter.UniqueName, out removedAdapter);
        }
コード例 #3
0
        /// <summary>
        /// Registers a specified Zyan transport adapter.
        /// </summary>
        /// <param name="adapter">Zyan transport adapter</param>
        public void Register(IClientTransportAdapter adapter)
        {
            if (adapter == null)
            {
                throw new ArgumentNullException("adapter");
            }

            if (_transportAdapters.ContainsKey(adapter.UniqueName))
            {
                throw new ArgumentException(string.Format(LanguageResource.ArgumentException_DuplicateChannelName, adapter.UniqueName), "channel");
            }

            _transportAdapters.TryAdd(adapter.UniqueName, adapter);
        }
コード例 #4
0
        /// <summary>
        /// Creates and configures a transport adapter.
        /// </summary>
        /// <returns>Transport adapter</returns>
        public virtual IClientTransportAdapter CreateTransportAdapter()
        {
            IClientTransportAdapter channel = ClientTransportAdapterManager.Instance.GetTransportAdapter(_channelName);

            if (channel == null)
            {
                if (_transportAdapterFactory == null)
                {
                    throw new ApplicationException(LanguageResource.ApplicationException_NoChannelFactorySpecified);
                }

                _channelSettings["name"] = _channelName;

                channel = _transportAdapterFactory(_channelSettings);
                return(channel);
            }
            return(channel);
        }
コード例 #5
0
        /// <summary>
        /// Release managed resources.
        /// </summary>
        public void Dispose()
        {
            if (!_isDisposed)
            {
                _isDisposed = true;

                if (_pollingTimer != null)
                {
                    _pollingTimer.Dispose();
                    _pollingTimer = null;
                }
                _pollingEnabled = false;

                if (_keepSessionAliveTimer != null)
                {
                    _keepSessionAliveTimer.Dispose();
                    _keepSessionAliveTimer = null;
                }
                try
                {
                    if (_proxies != null)
                    {
                        foreach (var proxyReference in _proxies)
                        {
                            if (proxyReference.IsAlive)
                            {
                                var proxy = proxyReference.Target as ZyanProxy;
                                proxy.RemoveAllRemoteEventHandlers();
                            }
                        }
                    }
                    //RemoteDispatcher.Logoff(_sessionID);
                    _transportAdapter.SendRequest(new RequestMessage()
                    {
                        RequestType     = RequestType.SystemOperation,
                        MethodName      = "Logoff",
                        Address         = _serverUrl,
                        ParameterValues = new object[] { _sessionID }
                    });
                }
                //TODO: Get rid of .NET Remoting dependency.
                //catch (RemotingException)
                //{ }
                catch (SocketException)
                { }
                catch (WebException)
                { }
                catch (MessageException)
                { }
                catch (Exception ex)
                {
                    Trace.WriteLine("Unexpected exception of type {0} caught while disposing ZyanConnection: {1}", ex.GetType(), ex.Message);
                }
                finally
                {
                    _connections.Remove(this);
                }
                if (_transportAdapter != null)
                {
                    // unregister remoting channel
                    var registeredChannel = ClientTransportAdapterManager.Instance.GetTransportAdapter(_transportAdapter.UniqueName);
                    if (registeredChannel != null && registeredChannel == _transportAdapter)
                    {
                        ClientTransportAdapterManager.Instance.Unregister(_transportAdapter);
                    }

                    // dispose remoting channel, if it's disposable
                    var disposableChannel = _transportAdapter as IDisposable;
                    if (disposableChannel != null)
                    {
                        disposableChannel.Dispose();
                    }

                    _transportAdapter = null;
                }
                _serverUrl             = string.Empty;
                _sessionID             = Guid.Empty;
                _protocolSetup         = null;
                _serializationHandling = null;
                _componentHostName     = string.Empty;

                if (_registeredComponents != null)
                {
                    _registeredComponents.Clear();
                    _registeredComponents = null;
                }
                if (_callInterceptors != null)
                {
                    _callInterceptors.Clear();
                    _callInterceptors = null;
                }
                if (_autoLoginCredentials != null)
                {
                    _autoLoginCredentials.Clear();
                    _autoLoginCredentials = null;
                }
                GC.WaitForPendingFinalizers();
            }
        }
コード例 #6
0
        /// <summary>
        /// Creates a new instance of the ZyanConnection class.
        /// </summary>
        /// <param name="serverUrl">URL of remote server (e.G. "tcp://server1:46123/myapp").</param>
        /// <param name="protocolSetup">Protocol and communication settings.</param>
        /// <param name="credentials">Login credentials.</param>
        /// <param name="autoLoginOnExpiredSession">Specifies whether the proxy should relogin automatically when the session expired.</param>
        /// <param name="keepSessionAlive">Specifies whether the session should be automaticly kept alive.</param>
        public ZyanConnection(string serverUrl, IClientProtocolSetup protocolSetup, Hashtable credentials, bool autoLoginOnExpiredSession, bool keepSessionAlive)
        {
            if (string.IsNullOrEmpty(serverUrl))
            {
                throw new ArgumentException(LanguageResource.ArgumentException_ServerUrlMissing, "serverUrl");
            }

            if (protocolSetup == null)
            {
                // try to select the protocol automatically
                protocolSetup = ClientProtocolSetup.GetClientProtocol(serverUrl);
                if (protocolSetup == null)
                {
                    throw new ArgumentNullException("protocolSetup");
                }
            }

            _proxies = new List <WeakReference>();

            _protocolSetup             = protocolSetup;
            _sessionID                 = Guid.NewGuid();
            _serverUrl                 = serverUrl;
            _autoLoginOnExpiredSession = autoLoginOnExpiredSession;
            _keepSessionAlive          = keepSessionAlive;

            if (_autoLoginOnExpiredSession)
            {
                _autoLoginCredentials = credentials;
            }

            _serializationHandling  = new SerializationHandlerRepository();
            CallInterceptionEnabled = false;
            _callInterceptors       = new CallInterceptorCollection();
            RegisterStandardSerializationHandlers();
            string[] addressParts = _serverUrl.Split('/');
            _componentHostName = addressParts[addressParts.Length - 1];

            _transportAdapter = _protocolSetup.CreateTransportAdapter();

            //TODO: Implement URL randomization without .NET Remoting dependency
            //if (AllowUrlRandomization)
            //{
            //    _transportChannel = ChannelWrapper.WrapChannel(_transportChannel);
            //}

            if (_transportAdapter != null)
            {
                var registeredChannel = ClientTransportAdapterManager.Instance.GetTransportAdapter(_transportAdapter.UniqueName);

                if (registeredChannel == null)
                {
                    ClientTransportAdapterManager.Instance.Register(_transportAdapter);
                }
            }
            else
            {
                throw new ApplicationException(LanguageResource.ApplicationException_NoChannelCreated);
            }

            string channelName = _transportAdapter.UniqueName;

            if (credentials != null && credentials.Count == 0)
            {
                credentials = null;
            }

            //try
            //{
            //TODO: Generate logon request message and send it through transport channel
            //RemoteDispatcher.Logon(_sessionID, credentials);
            _sessionAgeLimit = SendLogonMessage(_sessionID, credentials);

            //TODO: Request registered components through transport channel
            //_registeredComponents = new List<ComponentInfo>(RemoteDispatcher.GetRegisteredComponents());
            _registeredComponents = SendGetRegisteredComponentsMessage();

            //TODO: Extract session age limit from logon response message.
            //_sessionAgeLimit = RemoteDispatcher.SessionAgeLimit;
            //}
            //catch (Exception ex)
            //{
            //    // unregister remoting channel
            //    var registeredChannel = ClientTransportAdapterManager.Instance.GetTransportAdapter(channelName);
            //    if (registeredChannel != null)
            //        ClientTransportAdapterManager.Instance.Unregister(registeredChannel);

            //    // dispose channel if it's disposable
            //    var disposableChannel = registeredChannel as IDisposable;
            //    if (disposableChannel != null)
            //        disposableChannel.Dispose();

            //    throw ex.PreserveStackTrace();
            //}
            StartKeepSessionAliveTimer();

            _connections.Add(this);
        }
コード例 #7
0
        /// <summary>
        /// Registers a specified Zyan transport adapter.
        /// </summary>
        /// <param name="adapter">Zyan transport adapter</param>
        public void Register(IClientTransportAdapter adapter)
        {
            if (adapter==null)
                throw new ArgumentNullException("adapter");

            if (_transportAdapters.ContainsKey(adapter.UniqueName))
                throw new ArgumentException(string.Format(LanguageResource.ArgumentException_DuplicateChannelName, adapter.UniqueName), "channel");

            _transportAdapters.TryAdd(adapter.UniqueName, adapter);
        }
コード例 #8
0
        /// <summary>
        ///Unregisters a Zyan transport adapter.
        /// </summary>
        /// <param name="adapter">Transport adapter</param>
        public void Unregister(IClientTransportAdapter adapter)
        {
            if (adapter == null)
                throw new ArgumentNullException("adapter");

            IClientTransportAdapter removedAdapter;
            _transportAdapters.TryRemove(adapter.UniqueName, out removedAdapter);
        }