/// <summary>
 /// Starts the server application.
 /// </summary>
 /// <param name="configuration">The configuration.</param>
 public void StartService(ReverseConnectClientConfiguration configuration)
 {
     if (configuration == null)
     {
         throw new ArgumentNullException(nameof(configuration));
     }
     lock (m_lock)
     {
         if (m_state == ReverseConnectManagerState.Started)
         {
             throw new ServiceResultException(StatusCodes.BadInvalidState);
         }
         try
         {
             m_configurationWatcher = null;
             OnUpdateConfiguration(configuration);
             OpenHosts();
             m_state = ReverseConnectManagerState.Started;
         }
         catch (Exception e)
         {
             Utils.Trace(e, "Unexpected error starting reverse connect manager.");
             m_state = ReverseConnectManagerState.Errored;
             ServiceResult error = ServiceResult.Create(e, StatusCodes.BadInternalError, "Unexpected error starting reverse connect manager");
             throw new ServiceResultException(error);
         }
     }
 }
        /// <summary>
        /// Called when the reverse connect configuration is changed.
        /// </summary>
        /// <remarks>
        ///  An empty configuration or null stops service on all configured endpoints.
        /// </remarks>
        /// <param name="configuration">The client endpoint configuration.</param>
        protected virtual void OnUpdateConfiguration(ReverseConnectClientConfiguration configuration)
        {
            bool restartService = false;

            lock (m_lock)
            {
                if (m_configuration != null)
                {
                    StopService();
                    m_configuration = null;
                    restartService  = true;
                }

                m_configuration = configuration;

                // clear configured endpoints
                ClearEndpoints(true);

                if (configuration?.ClientEndpoints != null)
                {
                    foreach (var endpoint in configuration.ClientEndpoints)
                    {
                        var uri = Utils.ParseUri(endpoint.EndpointUrl);
                        if (uri != null)
                        {
                            AddEndpointInternal(uri, true);
                        }
                    }
                }

                if (restartService)
                {
                    StartService();
                }
            }
        }
 /// <inheritdoc/>
 public IApplicationConfigurationBuilderClientOptions SetReverseConnect(ReverseConnectClientConfiguration reverseConnect)
 {
     ApplicationConfiguration.ClientConfiguration.ReverseConnect = reverseConnect;
     return(this);
 }