Example #1
0
        /// <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);
                        }
                    }
                });
            }
        }
Example #2
0
 /// <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));
 }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        /// <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
                });
            }
        }