/// <summary>
        /// 接收消息
        /// </summary>
        /// <typeparam name="T">消息类型</typeparam>
        /// <param name="hubConnectionBuilder">Hub连接建造者</param>
        /// <param name="onReceive">消息接收事件</param>
        public static void Receive <T>(HubConnectionBuilder hubConnectionBuilder, Action <T> onReceive) where T : IMessage
        {
            #region # 验证

            if (!hubConnectionBuilder.HubConnectionBuilt)
            {
                throw new InvalidOperationException("Hub连接未构建,不可接收消息!");
            }

            #endregion

            string hubName = MessageExtension.GetHubName <T>();

            #region # 验证

            if (!hubConnectionBuilder.ReceiverProxies.ContainsKey(hubName))
            {
                throw new InvalidOperationException($"要接收的消息类型\"{typeof(T).Name}\"未注册!");
            }

            #endregion

            IHubProxy proxy = hubConnectionBuilder.ReceiverProxies[hubName];
            proxy.On <T>(CommonConstants.ExchangeMethodName, onReceive);
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <typeparam name="T">消息类型</typeparam>
        /// <param name="hubConnectionBuilder">Hub连接建造者</param>
        /// <param name="message">消息</param>
        public static async Task SendAsync <T>(HubConnectionBuilder hubConnectionBuilder, T message) where T : IMessage
        {
            #region # 验证

            if (!hubConnectionBuilder.HubConnectionBuilt)
            {
                throw new InvalidOperationException("Hub连接未构建,不可发送消息!");
            }

            #endregion

            string hubName = MessageExtension.GetHubName <T>();

            #region # 验证

            if (!hubConnectionBuilder.SenderProxies.ContainsKey(hubName))
            {
                throw new InvalidOperationException($"要发送的消息类型\"{typeof(T).Name}\"未注册!");
            }

            #endregion

            IHubProxy proxy = hubConnectionBuilder.SenderProxies[hubName];
            await proxy.Invoke(CommonConstants.ExchangeMethodName, message);

            //消息已发送事件
            OnMessageSent?.Invoke(message);
        }
        /// <summary>
        /// 注册接收消息类型
        /// </summary>
        /// <param name="messageTypes">消息类型列表</param>
        public void RegisterMessagesToReceive(IEnumerable <Type> messageTypes)
        {
            #region # 验证

            if (this.HubConnectionBuilt)
            {
                throw new InvalidOperationException("Hub连接已构建,不可注册接收消息类型!");
            }

            #endregion

            messageTypes = messageTypes?.Distinct().ToArray() ?? new Type[0];

            foreach (Type messageType in messageTypes)
            {
                #region # 验证

                if (!typeof(IMessage).IsAssignableFrom(messageType))
                {
                    throw new InvalidOperationException($"类型\"{messageType.Name}\"未实现\"{nameof(IMessage)}\"接口!");
                }

                #endregion

                string    hubName  = MessageExtension.GetHubName(messageType);
                IHubProxy hubProxy = this.HubConnection.CreateHubProxy(hubName);

                this._receiverProxies.Add(hubName, hubProxy);
            }
        }