コード例 #1
0
ファイル: RemoteServiceExecutor.cs プロジェクト: tobytop/Lamp
        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;
            }));
        }