/// <summary> /// 发送双向回调消息 /// </summary> /// <typeparam name="TContract">回调契约类型</typeparam> /// <typeparam name="TArgument">参数类型</typeparam> /// <param name="function">消息发送代理</param> /// <param name="argument">发送参数</param> /// <param name="clientHostName">客户端主机唯一识别名</param> public static void SendCallback <TContract, TArgument>(SendCallbackMessage <TContract, TArgument> function, TArgument argument, string clientHostName) where TContract : class { if (function == null) { throw new ArgumentNullException("function"); } bool isSuccess = false; int retryCount = RETRY_COUNT_FOR_FAILED; Exception exception = null; while (!isSuccess && retryCount-- > 0) { try { TContract svc = transporter.GetCallbackChannel <TContract>(clientHostName); if (svc == null) { throw new ContractNotFoundException(typeof(TContract)); } function(svc, argument); isSuccess = true; } catch (FaultException ex) { ExceptionHandler.Handle(ex); throw; } catch (ContractNotFoundException ex) { ExceptionHandler.Handle(ex); throw; } catch (Exception ex) { ExceptionHandler.Handle(ex); exception = ex; SendFailedRetryCounter <TContract>(retryCount, exception); } } if (!isSuccess) { SendFailed <TContract>(exception); } }