public async Task <RemoteCallBackData> InvokeAsync(List <ServerAddress> service, string serviceIdOrPath, IDictionary <string, object> paras, string token) { ServerAddress desc = await _addressSelector.GetAddressAsync(service); if (paras == null) { paras = new ConcurrentDictionary <string, object>(); } if (_retryTimes < 0) { _retryTimes = service.Count; } RemoteCallBackData result = null; Polly.Retry.RetryPolicy retryPolicy = Policy.Handle <Exception>() .RetryAsync(_retryTimes, async(ex, count) => { desc = await _addressSelector.GetAddressAsync(service); _logger.Debug( $"FaultHandling,retry times: {count},serviceId: {serviceIdOrPath},Address: {desc.Code},RemoteServiceCaller excute retry by Polly for exception {ex.Message}"); }); Polly.Wrap.PolicyWrap <RemoteCallBackData> fallbackPolicy = Policy <RemoteCallBackData> .Handle <Exception>() .FallbackAsync(new RemoteCallBackData() { ErrorCode = "500", ErrorMsg = "error occur when communicate with server. server maybe have been down." }) .WrapAsync(retryPolicy); return(await fallbackPolicy.ExecuteAsync(async() => { ITransportClient client = _transportClientFactory.CreateClient(desc); if (client == null) { return new RemoteCallBackData { ErrorCode = "400", ErrorMsg = "服务不可用" }; } _logger.Debug($"invoke: serviceId:{serviceIdOrPath}, parameters count: {paras.Count()}, token:{token}"); Payload payload = new Payload(); if (!string.IsNullOrEmpty(token) && _authorizationHandler != null && desc.EnableAuthorization) { var authorizationContext = _authorizationHandler.GetAuthorizationContext(token, desc.Roles); if (authorizationContext != null) { payload.Items = authorizationContext; } else { return new RemoteCallBackData { ErrorMsg = "没有权限", ErrorCode = "401" }; } } result = await client.SendAsync(new RemoteCallData { Payload = payload, Parameters = paras, ServiceId = serviceIdOrPath, Token = token, }); return result; })); }