/// <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); }