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 Microsoft.Extensions.DependencyInjection; using TEAMModelOS.SDK.Extension; using System.Text.Json; namespace Grpc.Extension.BaseService { /// /// Grpc元数据服务 /// public class MetaServiceAspnetCore : IGrpcBaseService { private readonly IServiceProvider _serviceProvider; public MetaServiceAspnetCore(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } /// /// 服务基本信息 /// 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 service = ActivatorUtilities.CreateInstance(_serviceProvider, methodInfo.ServiceType); // var task = (Task)methodInfo.Handler.DynamicInvoke(service, rq.RequestJson?.Trim().FromJson(methodInfo.RequestType), context); // task.Wait(); // dynamic result = task; // return new MethodInvokeRS { ResponseJson = ((object)result.Result).ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false }); // }); //} } }