Exemplo n.º 1
0
 /// <summary>
 /// 调用
 /// </summary>
 internal void Call()
 {
     if (!CheckCall())
     {
         return;
     }
     // 1 安全检查
     if (!SecurityCheck())
     {
         return;
     }
     // 2 初始化路由信息
     if (!InitializeContext())
     {
         return;
     }
     // 3 缓存快速处理
     if (RouteChahe.LoadCache(Data.Uri, Data.Bearer, out Data.CacheSetting, out Data.CacheKey, ref Data.ResultMessage))
     {
         //找到并返回缓存
         Data.Status = RouteStatus.Cache;
         return;
     }
     // 4 远程调用
     Data.ResultMessage = Data.RouteHost.ByZero ? CallZero() : CallHttp();
     // 5 结果检查
     Data.IsSucceed = CheckResult(Data);
 }
Exemplo n.º 2
0
 /// <summary>
 ///     初始化
 /// </summary>
 public static void Initialize()
 {
     ZeroApplication.Initialize();
     RouteOption.CheckOption();
     RouteChahe.InitCache();
     ZeroApplication.ZeroNetEvent += OnZeroNetEvent;
     ZeroApplication.Run();
 }
Exemplo n.º 3
0
 /// <summary>
 /// 初始化
 /// </summary>
 public static void Flush()
 {
     AppConfig.Initialize();
     RouteChahe.Flush();
     RuntimeWaring.Flush();
     ZeroFlush();
     //Datas = new List<RouteData>();
 }
Exemplo n.º 4
0
        /// <summary>
        ///     调用
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private static void CallTask(object arg)
        {
            HttpContext context = (HttpContext)arg;
            var         router  = new Router(context);

            //跨域支持
            if (router.Data.HttpMethod == "OPTIONS")
            {
                HttpProtocol.Cros(context.Response);
                return;
            }

            IoHandler.OnBegin(router.Data);
            try
            {
                //内容页转向
                if (router.Data.Uri.LocalPath.IndexOf(".", StringComparison.OrdinalIgnoreCase) > 0)
                {
                    context.Response.Redirect(RouteOption.Option.SystemConfig.ContextHost +
                                              router.Data.Uri.LocalPath.Trim('/'));
                    return;
                }

                HttpProtocol.FormatResponse(context.Response);
                //命令
                if (InnerCommand(router.Data.Uri.LocalPath, context.Response))
                {
                    return;
                }

                //开始调用
                if (!router.SecurityChecker.PreCheck())
                {
                    router.Data.Status = RouteStatus.DenyAccess;
                    context.Response.WriteAsync(ApiResult.DenyAccessJson, Encoding.UTF8);
                }
                else
                {
                    // 正常调用
                    router.Call();
                    // 写入返回
                    router.WriteResult();
                    // 缓存
                    RouteChahe.CacheResult(router.Data);
                }
            }
            catch (Exception e)
            {
                router.Data.Status = RouteStatus.LocalError;
                ZeroTrace.WriteException("Route", e);
                IocHelper.Create <IRuntimeWaring>()?.Waring("Route", router.Data.Uri.LocalPath, e.Message);
                context.Response.WriteAsync(ApiResult.LocalErrorJson, Encoding.UTF8);
            }
            finally
            {
                IoHandler.OnEnd(router.Data);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        ///     调用
        /// </summary>
        internal async void Call()
        {
            if (!CheckCall())
            {
                return;
            }
            if (Data.HostName.Equals("Zero", StringComparison.OrdinalIgnoreCase))
            {
                var manager = new ZeroManager();
                manager.Command(Data);
                return;
            }

            // 1 初始化路由信息
            if (!FindHost() || Data.RouteHost.Failed)
            {
                Data.Status        = RouteStatus.FormalError;
                Data.ResultMessage = ApiResult.NoFindJson;
                return;
            }

            // 2 安全检查
            if (!SecurityCheck())
            {
                return;
            }
            // 3 缓存快速处理
            if (RouteChahe.LoadCache(Data.Uri, Data.Bearer, out Data.CacheSetting, out Data.CacheKey,
                                     ref Data.ResultMessage))
            {
                //找到并返回缓存
                Data.Status = RouteStatus.Cache;
                return;
            }

            // 4 远程调用
            if (!Data.RouteHost.ByZero)
            {
                Data.ResultMessage = await CallHttp();
            }
            else if (ZeroApplication.ZerCenterIsRun)
            {
                Data.ResultMessage = CallZero();
            }
            else
            {
                Data.Status        = RouteStatus.LocalError;
                Data.ResultMessage = ApiResult.NoReadyJson;
                return;
            }
            // 5 结果检查
            if (!CheckResult(Data))
            {
                Data.Status = RouteStatus.RemoteError;
            }
        }
Exemplo n.º 6
0
 /// <summary>
 /// 初始化
 /// </summary>
 public static void Initialize()
 {
     // 日志支持
     //Agebull.Common.Logging.LogRecorder.GetRequestIdFunc = () => ApiContext.RequestContext.RequestId;.
     LogRecorder.Initialize(new RemoteRecorder());
     AppConfig.Initialize(Path.Combine(Startup.Configuration["contentRoot"], "route_config.json"));
     StationProgram.Run();
     RouteChahe.Flush();
     RuntimeWaring.Flush();
     RouteCommand.ZeroFlush();
     //Datas = new List<RouteData>();
 }
Exemplo n.º 7
0
        /*
         * /// <summary>
         * /// 数据
         * /// </summary>
         * internal static List<RouteData> Datas = new List<RouteData>();
         *
         * public static Mutex Mutex = new Mutex();
         *
         * /// <summary>
         * /// 流程结束后的处理
         * /// </summary>
         * internal static void PushFlowExtend(RouteData data)
         * {
         *  Datas.Add(data);
         *  Mutex.ReleaseMutex();
         * }
         *
         * /// <summary>
         * /// 流程结束后的处理
         * /// </summary>
         * internal static void FlowExtendTask()
         * {
         *  while (true)
         *  {
         *      if (!Mutex.WaitOne(1000))
         *      {
         *          continue;
         *      }
         *      var datas = Datas;
         *      Datas = new List<RouteData>();
         *      Mutex.ReleaseMutex();
         *      //最多处理后50行
         *      var index = 0;
         *      if (datas.Count > 50)
         *      {
         *          index = datas.Count - 50;
         *      }
         *      for (; index < datas.Count; index++)
         *      {
         *          ApiResult.CacheData(datas[index]);
         *      }
         *  }
         * }*/

        #endregion

        #region 内部命令处理


        /// <summary>
        ///     内部命令处理
        /// </summary>
        /// <param name="url"></param>
        /// <param name="response"></param>
        /// <returns></returns>
        public static bool InnerCommand(string url, HttpResponse response)
        {
            //命令
            switch (url)
            {
            case "/":
                response.WriteAsync("Wecome ZeroNet Http Router!", Encoding.UTF8);
                return(true);

            case "/_1_clear_1_":
                RouteChahe.Flush();
                response.WriteAsync(JsonConvert.SerializeObject(RouteOption.Option, Formatting.Indented),
                                    Encoding.UTF8);
                return(true);

            //case "/_1_counter_1_/info":
            //    response.WriteAsync(JsonConvert.SerializeObject(RouteCounter.Station, Formatting.Indented), Encoding.UTF8);
            //    return true;
            //case "/_1_counter_1_/save":
            //    RouteCounter.Save();
            //    response.WriteAsync(JsonConvert.SerializeObject(RouteCounter.Station, Formatting.Indented), Encoding.UTF8);
            //    return true;
            case "/_1_config_1_":
                response.WriteAsync(JsonConvert.SerializeObject(RouteOption.Option, Formatting.Indented),
                                    Encoding.UTF8);
                return(true);
                //case "/_1_warings_1_":
                //    response.WriteAsync(JsonConvert.SerializeObject(RuntimeWaring.WaringsTime, Formatting.Indented), Encoding.UTF8);
                //    return true;
                //case "/_1_cache_1_":
                //    response.WriteAsync(JsonConvert.SerializeObject(RouteChahe.Cache, Formatting.Indented), Encoding.UTF8);
                //    return true;
            }

            return(false);
        }
Exemplo n.º 8
0
 /// <summary>
 ///     刷新
 /// </summary>
 public static void Flush()
 {
     RouteChahe.Flush();
 }
Exemplo n.º 9
0
        /// <summary>
        /// 调用
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public static void CallTask(HttpContext context)
        {
            var uri = context.Request.GetUri();

            try
            {
                HttpProtocol.FormatResponse(context.Response);
                //内容页转向
                if (uri.LocalPath.IndexOf(".", StringComparison.OrdinalIgnoreCase) > 0)
                {
                    context.Response.Redirect(AppConfig.Config.SystemConfig.ContextHost + uri.LocalPath.Trim('/'));
                    return;
                }
                //跨域支持
                if (context.Request.Method.ToUpper() == "OPTIONS")
                {
                    HttpProtocol.Cros(context.Response);
                    return;
                }
                //命令
                if (RouteCommand.InnerCommand(uri.LocalPath, context.Response))
                {
                    return;
                }
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                RuntimeWaring.Waring("Route", uri.LocalPath, e.Message);
                context.Response.WriteAsync(RouteRuntime.InnerError, Encoding.UTF8);
                return;
            }

            var router = new HttpRouter(context);

            HttpIoLog.OnBegin(router.Data);
            var counter = PerformanceCounter.OnBegin(router.Data);

            try
            {
                var checker = new SecurityChecker
                {
                    Request = context.Request
                };
                if (!checker.PreCheck())
                {
                    router.Data.Status = RouteStatus.DenyAccess;
                    context.Response.WriteAsync(RouteRuntime.Inner2Error, Encoding.UTF8);
                }
                else
                {
                    // 正常调用
                    router.Call();
                    LogRecorder.BeginStepMonitor("End");
                    // 写入返回
                    router.WriteResult();
                    // 缓存
                    RouteChahe.CacheResult(router.Data);
                }
            }
            catch (Exception e)
            {
                router.Data.Status = RouteStatus.LocalError;
                LogRecorder.Exception(e);
                RuntimeWaring.Waring("Route", uri.LocalPath, e.Message);
                context.Response.WriteAsync(RouteRuntime.InnerError, Encoding.UTF8);
            }
            finally
            {
                //计时
                counter.End(router.Data);
                HttpIoLog.OnEnd(router.Data);
            }
        }