public ConnectionInfo(GrpcChannel grpcChannel,
                       DataAccess.DataAccessClient resourceManagementClient,
                       ClientContext clientContext)
 {
     GrpcChannel = grpcChannel;
     ResourceManagementClient = resourceManagementClient;
     ClientContext            = clientContext;
 }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="logger"></param>
        /// <param name="resourceManagementClient"></param>
        /// <param name="clientApplicationName"></param>
        /// <param name="clientWorkstationName"></param>
        /// <param name="requestedServerContextTimeoutMs"></param>
        /// <param name="requestedServerCultureName"></param>
        /// <param name="systemNameToConnect"></param>
        /// <param name="contextParams"></param>
        public ClientContext(ILogger <GrpcDataAccessProvider> logger,
                             IDispatcher callbackDispatcher,
                             DataAccess.DataAccessClient resourceManagementClient,
                             string clientApplicationName,
                             string clientWorkstationName,
                             uint requestedServerContextTimeoutMs,
                             string requestedServerCultureName,
                             string systemNameToConnect,
                             CaseInsensitiveDictionary <string> contextParams)
        {
            _logger                   = logger;
            _callbackDispatcher       = callbackDispatcher;
            _resourceManagementClient = resourceManagementClient;
            _applicationName          = clientApplicationName;
            _workstationName          = clientWorkstationName;

            var initiateRequest = new InitiateRequest
            {
                ClientApplicationName           = clientApplicationName,
                ClientWorkstationName           = clientWorkstationName,
                RequestedServerContextTimeoutMs = requestedServerContextTimeoutMs,
                RequestedServerCultureName      = requestedServerCultureName,
            };

            initiateRequest.SystemNameToConnect = systemNameToConnect;
            initiateRequest.ContextParams.Add(contextParams);

            InitiateReply initiateReply = _resourceManagementClient.Initiate(initiateRequest);

            _serverContextId        = initiateReply.ContextId;
            _serverContextTimeoutMs = initiateReply.ServerContextTimeoutMs;
            _serverCultureName      = initiateReply.ServerCultureName;

            if (_serverContextId == @"")
            {
                throw new Exception("Server returns empty contextId.");
            }

            SetResourceManagementLastCallUtc();

            _callbackMessageStream = resourceManagementClient.SubscribeForCallback(new SubscribeForCallbackRequest
            {
                ContextId = _serverContextId
            });

            _serverContextIsOperational = true;

            Task.Factory.StartNew(() =>
            {
                ReadCallbackMessagesAsync(_callbackMessageStream.ResponseStream, _cancellationTokenSource.Token).Wait();
            }, TaskCreationOptions.LongRunning);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="serverAddress"></param>
        /// <param name="clientApplicationName"></param>
        /// <param name="clientWorkstationName"></param>
        /// <param name="systemNameToConnect"></param>
        /// <param name="contextParams"></param>
        public void InitiateConnection(string serverAddress,
                                       string clientApplicationName,
                                       string clientWorkstationName,
                                       string systemNameToConnect,
                                       CaseInsensitiveDictionary <string> contextParams)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(@"Cannot access a disposed DataGrpcServerProxy.");
            }

            if (_connectionInfo is not null)
            {
                throw new Exception(@"DataGrpc context already exists.");
            }

#if DEBUG
            TimeSpan requestedServerContextTimeoutMs = new TimeSpan(0, 30, 0);
#else
            TimeSpan requestedServerContextTimeoutMs = new TimeSpan(0, 0, 30);
#endif
            GrpcChannel?grpcChannel = null;
            try
            {
                grpcChannel = GrpcChannel.ForAddress(serverAddress);

                var resourceManagementClient = new DataAccess.DataAccessClient(grpcChannel);

                var clientContext = new ClientContext(_logger,
                                                      _callbackDispatcher,
                                                      resourceManagementClient,
                                                      clientApplicationName,
                                                      clientWorkstationName,
                                                      (uint)requestedServerContextTimeoutMs.TotalMilliseconds,
                                                      CultureInfo.CurrentUICulture.Name,
                                                      systemNameToConnect,
                                                      contextParams
                                                      );

                _connectionInfo = new ConnectionInfo(grpcChannel, resourceManagementClient, clientContext);
            }
            catch
            {
                if (grpcChannel is not null)
                {
                    grpcChannel.Dispose();
                }
                throw;
            }

            _connectionInfo.ClientContext.ContextNotifyEvent += ClientContextOnContextNotifyEvent;
        }