示例#1
0
        /// <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);
            }
        }