internal void Add <TBehavior>(string path, Func <TBehavior> initializer)
            where TBehavior : WebSocketBehavior
        {
            lock (_sync)
            {
                path = HttpUtility.UrlDecode(path).TrimEndSlash();

                WebSocketServiceHost host;
                if (_hosts.TryGetValue(path, out host))
                {
                    _logger.Error(
                        "A WebSocket service with the specified path already exists:\n  path: " + path);

                    return;
                }

                host = new WebSocketServiceHost <TBehavior>(path, initializer, _logger);
                if (!_clean)
                {
                    host.KeepClean = false;
                }

                if (_waitTime != host.WaitTime)
                {
                    host.WaitTime = _waitTime;
                }

                if (_state == ServerState.Start)
                {
                    host.Start();
                }

                _hosts.Add(path, host);
            }
        }
        /// <summary>
        /// Tries to get the WebSocket service host with the specified <paramref name="path"/>.
        /// </summary>
        /// <returns>
        /// <c>true</c> if the service is successfully found; otherwise, <c>false</c>.
        /// </returns>
        /// <param name="path">
        /// A <see cref="string"/> that represents the absolute path to the service to find.
        /// </param>
        /// <param name="host">
        /// When this method returns, a <see cref="WebSocketServiceHost"/> instance that
        /// provides the access to the information in the service, or <see langword="null"/>
        /// if it's not found. This parameter is passed uninitialized.
        /// </param>
        public bool TryGetServiceHost(string path, out WebSocketServiceHost host)
        {
            var msg = _state.CheckIfAvailable(false, true, false) ?? path.CheckIfValidServicePath();

            if (msg != null)
            {
                _logger.Error(msg);
                host = null;

                return(false);
            }

            return(InternalTryGetServiceHost(path, out host));
        }
        internal bool InternalTryGetServiceHost(string path, out WebSocketServiceHost host)
        {
            bool ret;

            lock (_sync)
            {
                path = HttpUtility.UrlDecode(path).TrimEndSlash();
                ret  = _hosts.TryGetValue(path, out host);
            }

            if (!ret)
            {
                _logger.Error(
                    "A WebSocket service with the specified path isn't found:\n  path: " + path);
            }

            return(ret);
        }