/// <summary> /// 接口工厂 /// </summary> public class APIFactoryController : BaseApiController { /// <summary> /// 控制器缓存 /// </summary> private static readonly IList<ControllerCacheModel> ControllerList = new List<ControllerCacheModel>(); static APIFactoryController() { foreach (var item in PublicVars.WebAppAssemblys) { foreach (var controller in item.GetTypes().Where(p => p.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))) { ControllerList.Add(new ControllerCacheModel() { Name = controller.Name, Type = controller, LoginAttr = 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 isLogined = Thread.CurrentPrincipal.Identity.IsAuthenticated; 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 + "==>接口地址错误"); } if (chController.TypeObj == null)//按需加载下次使用 { chController.TypeObj = AutofacHelper.Resolve(chController.Type); } //获取方法 methodName = urlArr[1]; chMethod = chController.Methods.FirstOrDefault(p => p.Name.Equals(methodName, 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)), LoginAttr = method.CustomAttributes.Any(p => p.AttributeType == typeof(AuthorizeAttribute)) }; chController.Methods.Add(chMethod); //按需加载下次使用 } else { method = chMethod.Method; } //登录判断 if (isLogined == false && chMethod.NotLoginAttr == false && (chController.LoginAttr || chMethod.LoginAttr)) { return Content(HttpStatusCode.Unauthorized, item.Flag + "==>请先登录"); } #endregion #region 参数处理 if (item.Param != null && item.Param.Length > 0) { methodPram = method.GetParameters(); //方法参数集合 invokeParas = new Object[methodPram.Length]; for (int i = 0; i < methodPram.Length; i++) { 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(chController.TypeObj, 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();