public static async Task <RemoteCallBackData> Invoke(string path, IDictionary <string, object> paras, string httpMethod, IContainer container) { IRemoteServiceExecutor remoteServiceInvoker = container.Resolve <IRemoteServiceExecutor>(); ISerializer converter = container.Resolve <ISerializer>(); RemoteCallBackData result = await remoteServiceInvoker.InvokeAsync(path, paras, httpMethod); if (!string.IsNullOrEmpty(result.ExceptionMessage)) { throw new HttpStatusCodeException(400, $"{result.ToErrorString()}", path); } if (!string.IsNullOrEmpty(result.ErrorCode) || !string.IsNullOrEmpty(result.ErrorMsg)) { if (int.TryParse(result.ErrorCode, out int erroCode) && erroCode > 200 && erroCode < 600) { throw new HttpStatusCodeException(erroCode, result.ToErrorString(), path); } return(new RemoteCallBackData { ErrorCode = result.ErrorCode, ErrorMsg = result.ErrorMsg }); } if (result.ResultType == typeof(FileData).ToString()) { object file = converter.Deserialize(result.Result, typeof(FileData)); result.Result = file; } return(result); }
public static IServiceHostClientBuilder UseInServerForDiscovery(this IServiceHostClientBuilder serviceHostBuilder, params ServerAddress[] address) { serviceHostBuilder.RegisterService(cb => { cb.RegisterType <ClientServiceDiscovery>().As <IClientServiceDiscovery>().SingleInstance(); }); serviceHostBuilder.AddInitializer(container => { IClientServiceDiscovery clientDiscovery = container.Resolve <IClientServiceDiscovery>(); IRemoteServiceExecutor remoteExecutor = container.Resolve <IRemoteServiceExecutor>(); ISerializer serializer = container.Resolve <ISerializer>(); ITypeConvertProvider typeConverter = container.Resolve <ITypeConvertProvider>(); ILogger logger = container.Resolve <ILogger>(); StringBuilder sb = new StringBuilder(); foreach (ServerAddress addr in address) { sb.AppendFormat(addr.Code + ","); clientDiscovery.AddRoutesGetter(async() => { RemoteCallBackData result = await remoteExecutor.InvokeAsync(new List <ServerAddress>() { addr }, "Lamp.ServiceDiscovery.InServer.GetRoutesDescAsync".ToLower(), null, null); if (result == null || result.HasError) { return(null); } List <ServiceRouteDesc> routesDesc = (List <ServiceRouteDesc>)typeConverter.Convert(result.Result, typeof(List <ServiceRouteDesc>)); ServerDesc server = new ServerDesc { ServerAddress = addr, ServiceDescriptor = new List <ServiceDesc>() }; server.ServerAddress.IsHealth = true; foreach (ServiceRouteDesc desc in routesDesc) { ServiceDesc item = (ServiceDesc)desc.ServiceDescriptor.Clone(); server.ServiceDescriptor.Add(item); } return(server); }); } if (sb.Length > 0) { logger.Info($"[config]用服务端发现服务 {sb.ToString()}"); } }); serviceHostBuilder.AddRunner(container => { ClientServiceDiscovery clientServiceDiscovery = (ClientServiceDiscovery)container.Resolve <IClientServiceDiscovery>(); clientServiceDiscovery?.RunInInit().Wait(); }); return(serviceHostBuilder); }