private ServiceProxyInfo CreateServiceProxyInfo(Type serviceProxyType, MethodInfo actionProxyType, string proxyName, int serviceId, string serviceName, bool serviceEnabled, int actionId, string actionName, bool actionEnabled, int actionTimeout) { var proxyInfo = new ServiceProxyInfo() { ProxyName = proxyName, ServiceId = serviceId, ActionId = actionId, ServiceName = serviceName, ActionName = actionName, Timeout = actionTimeout, ServiceProxyType = serviceProxyType, ActionProxyType = actionProxyType, ReturnType = GetReturnType(actionProxyType), Enabled = serviceEnabled && actionEnabled }; return(proxyInfo); }
/// <summary> /// 添加Action /// </summary> /// <param name="serviceProxyInfo">服务代理信息</param> private void AddAction(ServiceProxyInfo serviceProxyInfo) { if (serviceProxyInfoList.ContainsKey(serviceProxyInfo.ActionProxyType)) { throw new InvalidOperationException($"ActionType has exist. ProxyName={ProxyName}, ActionType={serviceProxyInfo.ActionProxyType}"); } serviceProxyInfo.ProxyName = ProxyName; serviceProxyInfoList.Add(serviceProxyInfo.ActionProxyType, serviceProxyInfo); logger.LogInformation($"Add action success. ProxyName={ProxyName}, ServiceId={serviceProxyInfo.ServiceId}, ActionId={serviceProxyInfo.ActionId}, Enabled={serviceProxyInfo.Enabled}, Timeout={serviceProxyInfo.Timeout}, ActionProxyType={serviceProxyInfo.ActionProxyType}, ReturnType={serviceProxyInfo.ReturnType}"); }
/// <summary> /// 调用远程服务 /// </summary> /// <param name="actionType">Action类型</param> /// <param name="paramList">参数列表</param> /// <returns></returns> public virtual async Task <object> CallRemoteServiceAsync(MethodInfo actionType, object[] paramList) { ServiceProxyInfo serviceProxyInfo = GetServiceProxyInfo(actionType); if (serviceProxyInfo == null) { var actionTypeName = actionType != null ? actionType.Name : string.Empty; throw new InvalidOperationException($"Action not found. ActionTypeName={actionTypeName}"); } logger.LogInformation($"Call remote service beginning. ProxyName={serviceProxyInfo.ProxyName}, ServiceId={serviceProxyInfo.ServiceId}, ActionId={serviceProxyInfo.ActionId}"); logger.LogDebug($"Service proxy detail info. ProxyName={serviceProxyInfo.ProxyName}, ServiceId={serviceProxyInfo.ServiceId}, ActionId={serviceProxyInfo.ActionId}, Enabled={serviceProxyInfo.Enabled}, Timeout={serviceProxyInfo.Timeout}, ActionProxyType={serviceProxyInfo.ActionProxyType}, ReturnType={serviceProxyInfo.ReturnType}"); if (!serviceProxyInfo.Enabled) { throw new InvalidOperationException($"Action is disabled. ProxyName={serviceProxyInfo.ProxyName}, ServiceId={serviceProxyInfo.ServiceId},ActionId={serviceProxyInfo.ActionId}"); } logger.LogDebug($"Invoke ServiceCaller.CallAsync. ProxyName={serviceProxyInfo.ProxyName}, ServiceId={serviceProxyInfo.ServiceId}, ActionId={serviceProxyInfo.ActionId}, ParamList={(paramList == null || paramList.Length == 0 ? string.Empty : string.Join("|", paramList))}"); ServiceCallResult result = await serviceCaller.CallAsync(nodeClientContainer, new ServiceCallInfo() { ProxyName = serviceProxyInfo.ProxyName, ServiceId = serviceProxyInfo.ServiceId, ActionId = serviceProxyInfo.ActionId, ServiceName = serviceProxyInfo.ServiceName, ActionName = serviceProxyInfo.ActionName, ParamList = paramList, ReturnType = serviceProxyInfo.ReturnType, Timeout = serviceProxyInfo.Timeout }); logger.LogInformation($"Call remote service finished. ProxyName={serviceProxyInfo.ProxyName}, ServiceId={serviceProxyInfo.ServiceId}, ActionId={serviceProxyInfo.ActionId}"); return(result.ReturnVal); }