/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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(); } }
/// <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); }
/// <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); }
/// <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); }