using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using System.Reflection; namespace IM.InitCommon { public static class GrpcExtension { public static IServiceCollection AddAllGrpcServer(this IServiceCollection services) { services.AddGrpc(options => { // 开启详细错误(开发环境很有用,生产环境可结合配置读取) options.EnableDetailedErrors = true; // 限制最大接收和发送的消息大小 (例如 10MB,防止大包攻击) options.MaxReceiveMessageSize = 10 * 1024 * 1024; options.MaxSendMessageSize = 10 * 1024 * 1024; // TODO: 未来你可以在这里添加全局异常拦截器 (Interceptor) // options.Interceptors.Add(); }); return services; } public static IEndpointRouteBuilder MapAllGrpcServer(this IEndpointRouteBuilder endpoints) { // 获取调用此方法的程序集(即具体的微服务项目,如 MessageService) var assembly = Assembly.GetCallingAssembly(); // 获取 MapGrpcService 的方法反射信息 var mapGrpcServiceMethod = typeof(GrpcEndpointRouteBuilderExtensions) .GetMethods(BindingFlags.Static | BindingFlags.Public) .First(m => m.Name == "MapGrpcService" && m.GetGenericArguments().Length == 1); // 查找当前项目中所有继承了 gRPC 生成的 Base 类的具体实现类 // gRPC 生成的基类通常以 "Base" 结尾,例如 ConversationInternalBase var grpcTypes = assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.BaseType != null && t.BaseType.Name.EndsWith("Base")) .ToList(); // 循环并动态调用 MapGrpcService foreach (var type in grpcTypes) { var genericMethod = mapGrpcServiceMethod.MakeGenericMethod(type); genericMethod.Invoke(null, new object[] { endpoints }); } return endpoints; } } }