/// <summary> /// 构建路由信息 /// </summary> static void BuilderRouterInfo() { var baseModuleType = typeof(BaseModule); foreach (var svc in Const.Assemblys.Dic) { svc.Value.GetTypes().Where(x => x.GetTypeInfo().IsClass&& !x.GetTypeInfo().IsAbstract&& !x.GetTypeInfo().IsInterface && baseModuleType.IsAssignableFrom(x)).ToList().ForEach(t => { var methods = t.GetMethods().Where(m => !m.DeclaringType.Equals(baseModuleType) && !m.DeclaringType.Equals(typeof(object)) && m.IsPublic && !m.IsAbstract && !m.IsConstructor && !m.IsVirtual); foreach (var method in methods) { Routing.RoutInfo routInfo = new Routing.RoutInfo() { RoutMethod = method, RoutModuleType = t }; #region Authorization Filters /* * 全局过滤器 */ routInfo.AuthorizationFilters.AddRange(Routing.Routing.GlobalAuthorizationFilters); /* * 模块过滤器 */ routInfo.AuthorizationFilters.AddRange(t.GetAnnoCustomAttributes <IAuthorizationFilter>()); /* * 方法过滤器 */ routInfo.AuthorizationFilters.AddRange(method.GetAnnoCustomAttributes <IAuthorizationFilter>()); #endregion #region Action Filters /* * 全局过滤器 */ routInfo.ActionFilters.AddRange(Routing.Routing.GlobalActionFilters); /* * 模块过滤器 */ routInfo.ActionFilters.AddRange(routInfo.RoutModuleType.GetAnnoCustomAttributes <IActionFilter>()); /* * 方法过滤器 */ routInfo.ActionFilters.AddRange(routInfo.RoutMethod.GetAnnoCustomAttributes <IActionFilter>()); #endregion #region Exception Filters /* * 方法过滤器 */ routInfo.ExceptionFilters.AddRange(routInfo.RoutMethod.GetAnnoCustomAttributes <IExceptionFilter>()); /* * 模块过滤器 */ routInfo.ExceptionFilters.AddRange(routInfo.RoutModuleType.GetAnnoCustomAttributes <IExceptionFilter>()); /* * 全局过滤器 */ routInfo.ExceptionFilters.AddRange(Routing.Routing.GlobalExceptionFilters); #endregion #region CacheMiddleware /* * 全局Cache */ routInfo.CacheMiddleware.AddRange(Routing.Routing.GlobalCacheMiddleware); /* * 模块Cache */ routInfo.CacheMiddleware.AddRange(routInfo.RoutModuleType.GetCustomAttributes <Cache.CacheMiddlewareAttribute>()); /* * 方法Cache */ routInfo.CacheMiddleware.AddRange(routInfo.RoutMethod.GetCustomAttributes <Cache.CacheMiddlewareAttribute>()); #endregion var key = $"{t.FullName}/{method.Name}"; if (Routing.Routing.Router.ContainsKey(key)) { Routing.Routing.Router[key] = routInfo; } else { Routing.Routing.Router.TryAdd(key, routInfo); } } }); } }
/// <summary> /// 根据服务转发 /// </summary> /// <param name="input"></param> /// <param name="type">表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型</param> /// <returns></returns> public static async Task <ActionResult> TransmitAsync(Dictionary <string, string> input, Routing.RoutInfo routInfo) { return(await Task.Run(() => Transmit(input, routInfo)).ConfigureAwait(false)); }
/// <summary> /// 根据服务转发 /// </summary> /// <param name="input"></param> /// <param name="type">表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型</param> /// <returns></returns> public static ActionResult Transmit(Dictionary <string, string> input, Routing.RoutInfo routInfo) { BaseModule module = null; try { Interlocked.Increment(ref engineCounter); #region Cache string key = string.Empty; if (routInfo.CacheMiddleware.Count > 0) { key = GetDicStrHashCode(input); if (TryGetCache(routInfo, key, out ActionResult rltCache)) { return(rltCache); } } #endregion List <object> lo = new List <object>() { input }; module = Loader.IocLoader.Resolve <BaseModule>(routInfo.RoutModuleType); var init = module.Init(input); if (!init) { return(new ActionResult() { Status = false, Msg = "Init拦截!" }); } if (routInfo.RoutMethod == null) { return(new ActionResult() { Status = false, OutputData = null, Msg = $"在【{input[Eng.NAMESPACE]}】中找不到【{input[Eng.CLASS]}.{input[Eng.METHOD]}】!" }); } #region Authorization for (int i = 0; i < routInfo.AuthorizationFilters.Count; i++) { routInfo.AuthorizationFilters[i].OnAuthorization(module); if (!module.Authorized) { return(module.ActionResult == null ? new ActionResult() { Status = false, OutputData = 401, Msg = "401,Unauthrized" } : module.ActionResult ); } } #endregion for (int i = 0; i < routInfo.ActionFilters.Count; i++) { routInfo.ActionFilters[i].OnActionExecuting(module); } #region 调用业务方法 object rltCustomize = null; if (routInfo.ReturnTypeIsTask) { var rlt = (routInfo.RoutMethod.Invoke(module, DicToParameters(routInfo.RoutMethod, input).ToArray()) as Task); rltCustomize = routInfo.RoutMethod.ReturnType.GetProperty("Result").GetValue(rlt, null); } else { rltCustomize = routInfo.RoutMethod.Invoke(module, DicToParameters(routInfo.RoutMethod, input).ToArray()); } if (routInfo.ReturnTypeIsIActionResult && rltCustomize != null) { module.ActionResult = rltCustomize as ActionResult; } else { module.ActionResult = new ActionResult(true, rltCustomize); } #endregion for (int i = (routInfo.ActionFilters.Count - 1); i >= 0; i--) { routInfo.ActionFilters[i].OnActionExecuted(module); } if (routInfo.CacheMiddleware.Count > 0) { AddCache(routInfo, key, module.ActionResult); } return(module.ActionResult); } catch (Exception ex) { if (routInfo.RoutMethod != null) { if (module.ActionResult != null) { module.ActionResult.Status = false; module.ActionResult.Msg = ex.InnerException?.Message ?? ex.Message; } foreach (var ef in routInfo.ExceptionFilters) { ef.OnException(ex, module); } } #if DEBUG //记录日志 Log.Log.Error(ex, routInfo.RoutModuleType); #endif return(module.ActionResult ?? new ActionResult() { Status = false, OutputData = null, Msg = ex.InnerException?.Message ?? ex.Message }); } finally { Interlocked.Decrement(ref engineCounter); } }
/// <summary> /// 根据服务转发 /// </summary> /// <param name="input"></param> /// <param name="type">表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型</param> /// <returns></returns> public static ActionResult Transmit(Dictionary <string, string> input, Routing.RoutInfo routInfo) { BaseModule module = null; try { #region Cache string key = string.Empty; if (routInfo.CacheMiddleware.Count > 0) { key = GetDicStrHashCode(input); if (TryGetCache(routInfo, key, out ActionResult rltCache)) { return(rltCache); } } #endregion List <object> lo = new List <object>() { input }; module = Loader.IocLoader.Resolve <BaseModule>(routInfo.RoutModuleType); //创建实例(无参构造器) var init = module.Init(input); if (!init) { return(new ActionResult() { Status = false, Msg = "Init拦截!" }); } if (routInfo.RoutMethod == null) { return(new ActionResult() { Status = false, OutputData = null, Msg = $"在【{input[Eng.NAMESPACE]}】中找不到【{input[Eng.CLASS]}.{input[Eng.METHOD]}】!" }); } #region Authorization for (int i = 0; i < routInfo.AuthorizationFilters.Count; i++) { routInfo.AuthorizationFilters[i].OnAuthorization(module); if (!module.Authorized) { return(new ActionResult() { Status = false, OutputData = 401, Msg = "401,Unauthrized" }); } } #endregion for (int i = 0; i < routInfo.ActionFilters.Count; i++) { routInfo.ActionFilters[i].OnActionExecuting(module); } var rltCustomize = routInfo.RoutMethod.Invoke(module, DicToParameters(routInfo.RoutMethod, input).ToArray()); if (rltCustomize != null && typeof(IActionResult).IsAssignableFrom(rltCustomize.GetType())) { module.ActionResult = rltCustomize as ActionResult; } else { module.ActionResult = new ActionResult(true, rltCustomize); } for (int i = (routInfo.ActionFilters.Count - 1); i >= 0; i--) { routInfo.ActionFilters[i].OnActionExecuted(module); } if (routInfo.CacheMiddleware.Count > 0) { AddCache(routInfo, key, module.ActionResult); } return(module.ActionResult); } catch (Exception ex) { if (routInfo.RoutMethod != null) { foreach (var ef in routInfo.ExceptionFilters) { ef.OnException(ex, module); } } //记录日志 Log.Log.Error(ex, routInfo.RoutModuleType); return(new ActionResult() { Status = false, OutputData = null, Msg = ex.InnerException?.Message ?? ex.Message }); } }