.Net WebApi 反射调用多个接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | /// <summary> /// 接口工厂 /// </summary> public class APIFactoryController : BaseApiController { /// <summary> /// 控制器缓存 /// </summary> private static readonly IList<ControllerCacheModel> ControllerList = new List<ControllerCacheModel>(); static APIFactoryController() { foreach (Assembly item in PublicVars.WebAppAssemblys) { foreach (Type controller in item.GetTypes().Where(p => p.Name.EndsWith( "Controller" , StringComparison.OrdinalIgnoreCase))) { ControllerList.Add( new ControllerCacheModel() { Name = controller.Name, Type = controller, HaveLoginAttr = controller.CustomAttributes.Any(p => p.AttributeType == typeof (AuthorizeAttribute)) }); } } } /// <summary> /// 统一请求接口(★☆★将所有get请求合并为一个请求后通过该接口一次调用★☆★) /// </summary> /// <param name="model">请求参数</param> /// <returns>数据处理结果</returns> [Route( "api/APIFactory" )] [CompressionFilter] public async Task<IHttpActionResult> PostAsync(List<ReqPublicFun> model) { return await Task.Run(() => { return HandleReqData(model); }); } /// <summary> /// 数据处理 /// </summary> /// <param name="model"></param> /// <returns></returns> private IHttpActionResult HandleReqData(List<ReqPublicFun> model) { BaseResult<Dictionary< string , object >> rel = new BaseResult<Dictionary< string , object >>() { Data = new Dictionary< string , object >() }; string [] urlArr; string methodName; ControllerCacheModel chController; MethodCacheModel chMethod; MethodInfo method; ParameterInfo[] methodPram; Object[] invokeParas; ReqParam reqParam; bool hasReqParam; bool isLogined = Thread.CurrentPrincipal.Identity.IsAuthenticated; //控制器对象 Dictionary< string , object > objListController = new Dictionary< string , object >(); object objController = null ; foreach (ReqPublicFun item in model) { #region 调用前验证 urlArr = item.Url.Split( new char [] { '/' }, StringSplitOptions.RemoveEmptyEntries); //获取类 chController = ControllerList.FirstOrDefault(p => p.Name.Equals(urlArr[0] + "Controller" , StringComparison.OrdinalIgnoreCase)); if (chController == null ) { return Content(HttpStatusCode.NotFound, item.Flag + "==>接口地址错误" ); } objController = objListController.FirstOrDefault(p => p.Key == chController.Name).Value; if (objController == null ) { objController = AutofacHelper.Resolve(chController.Type); objListController.Add(chController.Name, objController); } //获取方法 methodName = urlArr[1]; chMethod = chController.Methods.FirstOrDefault(p => methodName.Equals(p.Name, StringComparison.OrdinalIgnoreCase)); if (chMethod == null ) { method = chController.Type.GetMethod(methodName); if (method == null ) { return Content(HttpStatusCode.NotFound, item.Flag + "==>接口地址错误" ); } chMethod = new MethodCacheModel() { Name = methodName, Method = method, NotLoginAttr = method.CustomAttributes.Any(p => p.AttributeType == typeof (AllowAnonymousAttribute)), HaveLoginAttr = method.CustomAttributes.Any(p => p.AttributeType == typeof (AuthorizeAttribute)) }; chController.Methods.Add(chMethod); //按需加载下次使用 } else { method = chMethod.Method; } //登录判断 if (isLogined == false && chMethod.NotLoginAttr == false && (chController.HaveLoginAttr || chMethod.HaveLoginAttr)) { return Content(HttpStatusCode.Unauthorized, item.Flag + "==>请先登录" ); } #endregion #region 参数处理 methodPram = method.GetParameters(); if (methodPram.Length > 0) { hasReqParam = item.Param != null && item.Param.Length > 0; invokeParas = new Object[methodPram.Length]; for ( int i = 0; i < methodPram.Length; i++) { if (hasReqParam) { reqParam = item.Param.FirstOrDefault(p => p.Name.Equals(methodPram[i].Name, StringComparison.OrdinalIgnoreCase)); if (reqParam != null ) { switch (methodPram[i].ParameterType.Name) { case "Guid" : invokeParas[i] = Guid.Parse(reqParam.Value.ToString()); break ; default : invokeParas[i] = Convert.ChangeType(reqParam.Value, methodPram[i].ParameterType); break ; } continue ; } } if (methodPram[i].HasDefaultValue) { invokeParas[i] = methodPram[i].DefaultValue; } } } else { invokeParas = null ; } #endregion //方法调用(用了委托发现并无性能提升故使用原生方法) rel.Data.Add(item.Flag, method.Invoke(objController, invokeParas)); } return Json(rel, SerializeHelper.JsonSerializerSettings); } } |
/// <summary>
/// 程序项目dll
/// </summary>
public static Assembly[] WebAppAssemblys => BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(p => p.GetName().Name.StartsWith("XX.Web.")).ToArray();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构