示例#1
0
        public IConfigurationSession OpenConfigurationSession(IClientAuthenticationCredential credentials)
        {
            this.credentials = credentials;
            try
            {
                _session = new OutProcConfigurationSession(_serviceURI, _channel, credentials, _channelFormatter);
                _session.IsDatabaseSession       = isDatabaseClient;
                _session.IsDistributorSession    = isDistributorClient;
                _session.IsConfigurationSession  = isConfigurationClient;
                ServerAuthenticationCredenital   = _session.Authenticate(credentials);
                _session.Channel.IsAuthenticated = ServerAuthenticationCredenital.IsAuthenticated;
                _session.SessionType             = _sessionType;

                if (ServerAuthenticationCredenital.IsAuthenticated)
                {
                    DetermineSecondaryConfigurationServer();
                    _session.SessionId = ServerAuthenticationCredenital.SessionId;
                    return(_session);
                }
                else
                {
                    throw new Alachisoft.NosDB.Common.Security.SecurityException(ErrorCodes.Security.USER_NOT_REGISTERED, new string[1] {
                        credentials.UserName
                    });
                }
            }
            catch (Exception ex)
            {
                _channel.Disconnect();
                throw;
            }
        }
示例#2
0
        private bool ConnectToPeerServer(bool changeRole = true)
        {
            if (IsClustered)
            {
                try
                {
                    DatabaseRPCService   rpcService      = new DatabaseRPCService(_peerNode.Name);
                    IConfigurationServer remoteCfgServer = rpcService.GetConfigurationServer(new TimeSpan(0, 1, 30), Common.Communication.SessionTypes.Client, new ConfigurationChannelFormatter());
                    ((OutProcConfigurationClient)remoteCfgServer).AutoReconnect = false;
                    remoteCfgServer.MarkConfiguraitonSession();
                    OutProcConfigurationSession session = remoteCfgServer.OpenConfigurationSession(new SSPIClientAuthenticationCredential()) as OutProcConfigurationSession;
                    session.SetChannelDisconnectedListener(this);
                    session.AutoReconnect = false;
                    session.MarkSessionInternal();
                    _session = session;

                    if (LoggerManager.Instance.CONDBLogger != null && LoggerManager.Instance.CONDBLogger.IsInfoEnabled)
                    {
                        LoggerManager.Instance.CONDBLogger.Info("ConfigurationCluster.Connect", "connected with peer server " + _peerNode.Name);
                    }
                }
                catch (Exception e)
                {
                    //if (LoggerManager.Instance.CONDBLogger != null && LoggerManager.Instance.CONDBLogger.IsErrorEnabled)
                    //    LoggerManager.Instance.CONDBLogger.Error("ConfigurationCluster.Connect", e.ToString());
                }
            }

            if (changeRole)
            {
                DetermineRole();

                if (_currentRole == NodeRole.Secondary)
                {
                    if (_configuration != null)
                    {
                        ServerNode localNode = _configuration.Servers.GetNode(_localServerIP);

                        if (_peerNode != null && _peerNode.Priority > localNode.Priority)
                        {
                            //Let's take over
                            TakeOverPrimaryRole();
                        }
                        else
                        {
                            //Need to replicate state from peer node
                            ReplicateStateFromPeerServer();
                        }
                    }
                    _status.SetStatusBit(RUNNING, UNINITIIALIZED);
                }
            }

            return(_session != null);
        }
示例#3
0
 public void ChannelDisconnected(IRequestResponseChannel channel, string reason)
 {
     if (_disposed)
     {
         return;
     }
     lock (this)
     {
         _session = null;
         //Try to re-connect immediately.
         if (ConnectToPeerServer(false))
         {
             return;
         }
         //In case we are unable to reconnect
         DetermineRole();
         ConnectInBackground();
     }
 }