private void ListMethods(FileDescriptorResponse resp, InfoRS infoRs) { byte[] bytes = new byte[resp.FileDescriptorProto.First().Length]; resp.FileDescriptorProto.First().CopyTo(bytes, 0); var fdp = ProtobufExtensions.Deserialize <FileDescriptorProto>(bytes); foreach (var service in fdp.Services) { foreach (var method in service.Methods) { var name = $"{fdp.Package}.{service.Name}/{method.Name}"; infoRs.MethodInfos.Add(new MethodInfo() { Name = name }); var inputTypeName = method.InputType.Split('.').Last(); var outputTypeName = method.OutputType.Split('.').Last(); var intputType = fdp.MessageTypes.First(p => p.Name == inputTypeName); var outputType = fdp.MessageTypes.First(p => p.Name == outputTypeName); var infoMethodRS = new MethodInfoRS() { RequestJson = intputType.Fields.ToDictionary(p => p.Name, p => GetFiledDefaultValue(p, fdp.MessageTypes)).ToJson(), ResponseJson = outputType.Fields.ToDictionary(p => p.Name, p => GetFiledDefaultValue(p, fdp.MessageTypes)).ToJson() }; dicInfoMethods.AddOrUpdate(name, infoMethodRS, (k, v) => infoMethodRS); } } }
public async Task <IActionResult> OnGet(string serviceName, string serverAddress = null) { ServiceName = serviceName?.Trim(); CurrentAddressInfo = serverAddress?.Trim(); AddressInfos = new List <string> { CurrentAddressInfo }; if (string.IsNullOrWhiteSpace(ServiceName) && string.IsNullOrWhiteSpace(CurrentAddressInfo)) { return(RedirectToPage("Error", new { msg = "请指定consul服务名称或Grpc服务地址" })); } if (!string.IsNullOrWhiteSpace(serverAddress)) { var arr = serverAddress.Split(':', System.StringSplitOptions.RemoveEmptyEntries); var ip = arr[0]; var port = int.Parse(arr[1]); Info = await _grpcSrv.GetInfo(ip, port); } else { var service = await _consulSrv.GetService(ServiceName); if (service == null || service.Count == 0) { return(RedirectToPage("Error", new { msg = $"consul中找不到服务{ServiceName}" })); } AddressInfos = service.Select(q => $"{q.Address}:{q.Port}").Distinct().ToList(); var ip = service.First().Address; var port = service.First().Port; CurrentAddressInfo = $"{ip}:{port}"; Info = await _grpcSrv.GetInfo(ip, port); } if (Info == null) { return(RedirectToPage("Error", new { msg = $"consul服务({ServiceName})未集成FM.GrpcExtensions" })); } return(Page()); }
public async Task <InfoRS> GetInfo(string address, int port) { var result = new InfoRS(); var channel = new Channel(address, port, ChannelCredentials.Insecure); try { var client = new ServerReflection.ServerReflectionClient(channel); var resp = client.ServerReflectionInfo(); await resp.RequestStream.WriteAsync(new ServerReflectionRequest() { ListServices = "" }); await resp.ResponseStream.ForEachAsync(async res => { switch (res.MessageResponseCase.ToString()) { case "ListServicesResponse": await ListServices(resp.RequestStream, res.ListServicesResponse); break; case "FileDescriptorResponse": ListMethods(res.FileDescriptorResponse, result); break; } }); } catch (Exception ex) { _logger.LogError(ex, ex.Message); throw ex; } finally { await channel.ShutdownAsync(); } return(result); }