/// <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"]; }
/// <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); }
/// <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); } }