Exemple #1
0
 /// <summary>
 ///     内部构架
 /// </summary>
 /// <param name="context"></param>
 internal Router(HttpContext context)
 {
     HttpContext = context;
     Request     = context.Request;
     Response    = context.Response;
     Data        = new RouteData();
     Data.Prepare(context.Request);
     SecurityChecker = new SecurityChecker {
         Data = Data
     };
     ApiContext.Current.Request.Ip           = HttpContext.Connection.RemoteIpAddress.ToString();
     ApiContext.Current.Request.Port         = HttpContext.Connection.RemotePort.ToString();
     ApiContext.Current.Request.ArgumentType = ArgumentType.Json;
     ApiContext.Current.Request.UserAgent    = Request.Headers["User-Agent"];
 }
Exemple #2
0
        /// <summary>
        ///     安全检查
        /// </summary>
        private bool SecurityCheck()
        {
            string authorization = Request.Headers["Authorization"];

            if (String.IsNullOrWhiteSpace(authorization))
            {
                Data.Bearer = Request.Query["ClientKey"];
                return(true);
            }

            var words = authorization.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);

            if (words.Length != 2 || !String.Equals(words[0], "Bearer", StringComparison.OrdinalIgnoreCase) || words[1].Equals("null") || words[1].Equals("undefined"))
            {
                Data.Bearer = null;
            }
            else
            {
                Data.Bearer = words[1];
            }

            var checker = new SecurityChecker
            {
                Request = Request,
                Bearer  = Data.Bearer
            };

            if (checker.Check())
            {
                return(true);
            }
            Data.Status        = RouteStatus.DenyAccess;
            Data.ResultMessage = AppConfig.Config.Security.BlockHost;
            Response.Redirect(AppConfig.Config.Security.BlockHost, false);
            Data.Redirect = true;
            return(false);
        }
Exemple #3
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);
            }
        }