using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Grpc.Core; using Grpc.Extension.BaseService.Model; using System.Linq; using Grpc.Extension.Common; using TEAMModelOS.SDK.Extension; using System.Text.Json; namespace Grpc.Extension.BaseService { /// /// Grpc元数据服务 /// public class MetaService : IGrpcBaseService { /// /// 服务基本信息 /// public Task Info(InfoRQ rq, ServerCallContext context) { return Task.Run(() => { var methods = MetaModel.Methods.Select(q => q.FullName?.Trim()).ToList(); if (!string.IsNullOrWhiteSpace(rq.MethodName)) { methods = methods?.Where(q => q.ToLower().Contains(rq.MethodName.Trim().ToLower())).ToList(); } var methodInfos = new List(); foreach (var m in methods) { var info = new GrpcMethodInfo { Name = m }; info.IsThrottled = ThrottleManager.Instance.IsThrottled(m); info.SaveResponseEnable = MonitorManager.Instance.SaveResponseMethodEnable(m); methodInfos.Add(info); } return new InfoRS { IpAndPort = $"{MetaModel.Ip}:{MetaModel.Port}", StartTime = MetaModel.StartTime.ToUnixTimestamp(), MethodInfos = methodInfos }; }); } /// /// 服务方法的详细信息 /// public Task MethodInfo(MethodInfoRQ rq, ServerCallContext context) { return Task.Run(() => { var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim()); if (methodInfo == null) { return new MethodInfoRS(); } return new MethodInfoRS { RequestJson = Activator.CreateInstance(methodInfo.RequestType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false }), ResponseJson = Activator.CreateInstance(methodInfo.ResponseType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false }) }; }); } //TODO 此段代碼後續檢視 /// /// 服务方法调用 /// //public Task MethodInvoke(MethodInvokeRQ rq, ServerCallContext context) //{ // //return Task.Run(() => // //{ // // var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim()); // // if (methodInfo == null) // // { // // return new MethodInvokeRS() { ResponseJson = $"not fount method by fullname:{rq.FullName}" }; // // } // // var task = (Task)methodInfo.Handler.DynamicInvoke(rq.RequestJson?.Trim().FromJson(methodInfo.RequestType), context); // // task.Wait(); // // dynamic result = task; // // return new MethodInvokeRS { ResponseJson = ((object)result.Result).ToJson(ignoreNullValue: false, isIndented: true) }; // //}); //} } }