/// <summary>
        /// 发送双向请求消息
        /// </summary>
        /// <typeparam name="TContract">契约类型</typeparam>
        /// <typeparam name="TReturnData">返回值类型</typeparam>
        /// <typeparam name="TArgument">参数类型</typeparam>
        /// <param name="context">服务实例上下文</param>
        /// <param name="function">消息发送代理</param>
        /// <param name="argument">发送参数</param>
        /// <returns>返回值</returns>
        public static TReturnData Send <TContract, TReturnData, TArgument>(InstanceContext context, SendDuplexMessage <TContract, TReturnData, TArgument> function, TArgument argument) where TContract : class
        {
            if (function == null)
            {
                throw new ArgumentNullException("function");
            }

            bool        isSuccess  = false;
            int         retryCount = RETRY_COUNT_FOR_FAILED;
            Exception   exception  = null;
            TReturnData data       = default(TReturnData);

            while (!isSuccess && retryCount-- > 0)
            {
                try
                {
                    TContract svc = transporter.GetDuplexChannel <TContract>(context);
                    data      = function(svc, argument);
                    isSuccess = true;
                }
                catch (FaultException ex)
                {
                    ExceptionHandler.Handle(ex);
                    throw;
                }
                catch (Exception ex)
                {
                    ExceptionHandler.Handle(ex);
                    exception = ex;
                    SendFailedRetryCounter <TContract>(retryCount, exception);
                }
            }

            if (!isSuccess)
            {
                SendFailed <TContract>(exception);
            }

            return(data);
        }