/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { object result = default(T); var vt = _commandProvider.GetCommand(serviceId); var command = vt.IsCompletedSuccessfully ? vt.Result : await vt; RemoteInvokeResultMessage message = null; var decodeJOject = typeof(T) == TypeHelper.ObjectType; IInvocation invocation = null; var existsInterceptor = _interceptors.Any(); var serviceRoute = await _serviceRouteProvider.Locate(serviceId); if ((serviceRoute == null || !serviceRoute.ServiceDescriptor.ExistIntercept()) || decodeJOject) { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message == null) { if (command.FallBackName != null && _serviceProvider.IsRegistered <IFallbackInvoker>(command.FallBackName) && command.Strategy == StrategyType.FallBack) { var invoker = _serviceProvider.GetInstances <IFallbackInvoker>(command.FallBackName); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey)); } else { var invoker = _serviceProvider.GetInstances <IClusterInvoker>(command.Strategy.ToString()); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey, typeof(T) == TypeHelper.ObjectType)); } } } else { invocation = invocation == null?GetInvocation(parameters, serviceId, typeof(T)) : invocation; foreach (var interceptor in _interceptors) { var interceptReuslt = await Intercept(interceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } } if (message != null) { if (message.Result == null) { result = message.Result; } else { result = _typeConvertibleService.Convert(message.Result, typeof(T)); } } return((T)result); }
/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { object result = default(T); var command = await _commandProvider.GetCommand(serviceId); RemoteInvokeResultMessage message; if (!command.RequestCacheEnabled) { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey); if (message == null) { var invoker = _serviceProvider.GetInstances <IClusterInvoker>(command.Strategy.ToString()); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey)); } } else { var invocation = GetInvocation(parameters, serviceId, typeof(T)); await _interceptor.Intercept(invocation); message = invocation.ReturnValue is RemoteInvokeResultMessage ? invocation.ReturnValue as RemoteInvokeResultMessage : null; result = invocation.ReturnValue; } if (message != null) { result = _typeConvertibleService.Convert(message.Result, typeof(T)); } return((T)result); }
/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { object result = default(T); var command = await _commandProvider.GetCommand(serviceId); RemoteInvokeResultMessage message = null; var decodeJOject = typeof(T) == UtilityType.ObjectType; IInvocation invocation = null; var existsInterceptor = _interceptors.Any(); if ((_cacheInterceptor == null || !command.RequestCacheEnabled) && !existsInterceptor) { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message == null || !message.IsSucceedRemoteInvokeCalled()) { return(await FallBackRetryInvoke <T>(parameters, serviceId, command)); } } if (_cacheInterceptor != null && command.RequestCacheEnabled) { invocation = GetCacheInvocation(parameters, serviceId, typeof(T)); if (invocation != null) { var interceptReuslt = await Intercept(_cacheInterceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } else { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message == null || !message.IsSucceedRemoteInvokeCalled()) { return(await FallBackRetryInvoke <T>(parameters, serviceId, command)); } } } if (existsInterceptor) { invocation = invocation == null?GetInvocation(parameters, serviceId, typeof(T)) : invocation; foreach (var interceptor in _interceptors) { var interceptReuslt = await Intercept(interceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } } if (message != null) { result = await GetInvokeResult <T>(message); } return((T)result); }
/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { object result = default(T); var command = await _commandProvider.GetCommand(serviceId); RemoteInvokeResultMessage message = null; var decodeJOject = typeof(T) == UtilityType.ObjectType; IInvocation invocation = null; var existsInterceptor = _interceptors.Any(); if ((!command.RequestCacheEnabled || decodeJOject) && !existsInterceptor) { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message == null) { if (command.FallBackName != null && _serviceProvider.IsRegistered <IFallbackInvoker>(command.FallBackName) && command.Strategy == StrategyType.FallBack) { var invoker = _serviceProvider.GetInstances <IFallbackInvoker>(command.FallBackName); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey)); } else { var invoker = _serviceProvider.GetInstances <IClusterInvoker>(command.Strategy.ToString()); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey, typeof(T) == UtilityType.ObjectType)); } } } if (command.RequestCacheEnabled && !decodeJOject) { invocation = GetCacheInvocation(parameters, serviceId, typeof(T)); var interceptReuslt = await Intercept(_cacheInterceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } if (existsInterceptor) { invocation = invocation == null?GetInvocation(parameters, serviceId, typeof(T)) : invocation; foreach (var interceptor in _interceptors) { var interceptReuslt = await Intercept(interceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } } if (message != null) { result = _typeConvertibleService.Convert(message.Result, typeof(T)); } return((T)result); }
public async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId, string _serviceKey, bool decodeJOject) { var time = 0; T result = default(T); RemoteInvokeResultMessage message = null; var command = await _commandProvider.GetCommand(serviceId); do { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message != null && message.Result != null) { result = (T)_typeConvertibleService.Convert(message.Result, typeof(T)); } } while (message == null && ++time < command.FailoverCluster); return(result); }
/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { var message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey); if (message == null) { var command = _commandProvider.GetCommand(serviceId); var invoker = _serviceProvider.GetInstances <IClusterInvoker>(command.Strategy.ToString()); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey)); } if (message == null) { return(default(T)); } var result = _typeConvertibleService.Convert(message.Result, typeof(T)); return((T)result); }
public async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId, string _serviceKey, bool decodeJOject) { var time = 0; T result = default(T); RemoteInvokeResultMessage message = null; var command = await _commandProvider.GetCommand(serviceId); do { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject, true); if (message != null) { if (message.StatusCode == StatusCode.Success) { if (message.Result != null) { result = (T)_typeConvertibleService.Convert(message.Result, typeof(T)); } else { result = default(T); } } else if (message.IsFailedRemoteInvokeCalled()) { continue; } else if (message.IsSucceedRemoteInvokeCalled()) { throw message.GetExceptionByStatusCode(); } } } while ((message == null || !message.IsSucceedRemoteInvokeCalled()) && ++time < command.FailoverCluster); if (message == null) { throw new CPlatformException($"{serviceId}远程服务调用失败,暂不存在可用的服务实例"); } if (message.StatusCode != StatusCode.Success) { throw message.GetExceptionByStatusCode(); } return(result); }
/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { object result = default(T); var command = await _commandProvider.GetCommand(serviceId); RemoteInvokeResultMessage message; var decodeJOject = typeof(T) == UtilityType.ObjectType; if (!command.RequestCacheEnabled || decodeJOject) { var v = typeof(T).FullName; message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message == null) { if (command.FallBackName != null && _serviceProvider.IsRegistered <IFallbackInvoker>(command.FallBackName) && command.Strategy == StrategyType.FallBack) { var invoker = _serviceProvider.GetInstances <IFallbackInvoker>(command.FallBackName); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey)); } else { var invoker = _serviceProvider.GetInstances <IClusterInvoker>(command.Strategy.ToString()); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey, typeof(T) == UtilityType.ObjectType)); } } } else { var invocation = GetInvocation(parameters, serviceId, typeof(T)); await _interceptor.Intercept(invocation); message = invocation.ReturnValue is RemoteInvokeResultMessage ? invocation.ReturnValue as RemoteInvokeResultMessage : null; result = invocation.ReturnValue; } if (message != null) { result = _typeConvertibleService.Convert(message.Result, typeof(T)); } return((T)result); }
public async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId, string _serviceKey, bool decodeJOject) { var time = 0; T result = default(T); RemoteInvokeResultMessage message = null; var vtCommand = _commandProvider.GetCommand(serviceId); var command = vtCommand.IsCompletedSuccessfully ? vtCommand.Result : await vtCommand; do { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message != null && message.Result != null) { if (message.StatusCode != StatusCode.Success && time >= command.FailoverCluster) { throw new CPlatformException(message.ExceptionMessage, message.StatusCode); } result = (T)_typeConvertibleService.Convert(message.Result, typeof(T)); } } while ((message == null || message.StatusCode == StatusCode.ServiceUnavailability) && ++time < command.FailoverCluster); return(result); }
/// <summary> /// 远程调用。 /// </summary> /// <typeparam name="T">返回类型。</typeparam> /// <param name="parameters">参数字典。</param> /// <param name="serviceId">服务Id。</param> /// <returns>调用结果。</returns> protected async Task <T> Invoke <T>(IDictionary <string, object> parameters, string serviceId) { object result = default(T); var vt = _commandProvider.GetCommand(serviceId); var command = vt.IsCompletedSuccessfully ? vt.Result : await vt; RemoteInvokeResultMessage message = null; var decodeJOject = typeof(T) == UtilityType.ObjectType; IInvocation invocation = null; var existsInterceptor = _interceptors.Any(); if ((_cacheInterceptor == null || !command.RequestCacheEnabled) && !existsInterceptor) { message = await _breakeRemoteInvokeService.InvokeAsync(parameters, serviceId, _serviceKey, decodeJOject); if (message == null) { if (command.FallBackName != null && _serviceProvider.IsRegistered <IFallbackInvoker>(command.FallBackName) && command.Strategy == StrategyType.FallBack) { var invoker = _serviceProvider.GetInstances <IFallbackInvoker>(command.FallBackName); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey)); } else { var invoker = _serviceProvider.GetInstances <IClusterInvoker>(command.Strategy.ToString()); return(await invoker.Invoke <T>(parameters, serviceId, _serviceKey, typeof(T) == UtilityType.ObjectType)); } } } if (_cacheInterceptor != null && command.RequestCacheEnabled) { invocation = GetCacheInvocation(parameters, serviceId, typeof(T)); var interceptReuslt = await Intercept(_cacheInterceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } if (existsInterceptor) { invocation = invocation == null?GetInvocation(parameters, serviceId, typeof(T)) : invocation; foreach (var interceptor in _interceptors) { var interceptReuslt = await Intercept(interceptor, invocation); message = interceptReuslt.Item1; result = interceptReuslt.Item2 == null ? default(T) : interceptReuslt.Item2; } } //if (message != null) //{ // if (message.Result == null) result = message.Result; // else result = _typeConvertibleService.Convert(message.Result, typeof(T)); //} if (message != null) { if (message.StatusCode == StatusCode.Success) { result = _typeConvertibleService.Convert(message.Result, typeof(T)); } else { switch (message.StatusCode) { case StatusCode.BusinessError: throw new BusinessException(message.ExceptionMessage); case StatusCode.CommunicationError: throw new CommunicationException(message.ExceptionMessage); case StatusCode.RequestError: case StatusCode.CPlatformError: case StatusCode.UnKnownError: throw new CPlatformException(message.ExceptionMessage, message.StatusCode); case StatusCode.DataAccessError: throw new DataAccessException(message.ExceptionMessage); case StatusCode.UnAuthentication: throw new UnAuthenticationException(message.ExceptionMessage); case StatusCode.UnAuthorized: throw new UnAuthorizedException(message.ExceptionMessage); case StatusCode.UserFriendly: throw new UserFriendlyException(message.ExceptionMessage); case StatusCode.ValidateError: throw new ValidateException(message.ExceptionMessage); } throw new CPlatformException(message.ExceptionMessage, message.StatusCode); } } return((T)result); }