private void OnBeginRequest(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; Uri uri = context.Request.Url; string wap = Settings.Instance.WapDomain; string url = context.Request.AppRelativeCurrentExecutionFilePath.Substring(1); bool isWap = UrlParse.EqualsDomain(uri.DnsSafeHost, wap); if (!RedirectToWap(context, isWap, wap) || "POST".Equals(context.Request.HttpMethod)) { UrlParse parse = new UrlParse(url); Application app = new Application(context, isWap); if (Settings.Instance.UrlMode == Configuration.SiteUrlMode.Static) { RenderStatic(app, parse, uri); } else { RenderRewrite(app, parse, uri); } } else { url = string.Concat(uri.Scheme, "://", wap, uri.Port != 80 ? string.Concat(":", uri.Port.ToString()) : string.Empty, url); try { context.Response.Redirect(url, true); } catch { } } }
private void RenderResource(Application app, UrlParse parse, ExtensionType type, Uri url) { if (parse.ExtensionType == type) { RenderResource(app, parse, url); } else { app.RenderError(404); } }
private void RenderResource(Application app, UrlParse parse, Uri url) { if (parse.IsDirectory) { if (url != null && url.Query.StartsWith("??")) { try { string path; ResourceHandler handler = null; string[] array = url.Query.Substring(2).Split(','); string[] paths = new string[array.Length]; for (int i = 0; i < array.Length; ++i) { path = array[i]; if (i == 0) { UrlParse p = new UrlParse(path); handler = ResourceHandler.Parse(p.ExtensionType, p.Extension, false); if (handler == null) { throw new Exception(); } } paths[i] = app.Context.Server.MapPath(string.Concat(parse.Url, path)); } handler.ProcessRequest(app.Context, paths); } catch (Exception) { app.RenderError(404); } } else { app.RenderError(404); } } else { ResourceHandler handler = ResourceHandler.Parse(parse.ExtensionType, parse.Extension, false); if (handler != null && File.Exists(app.Context.Request.PhysicalPath)) { handler.ProcessRequest(app.Context, app.Context.Request.PhysicalPath); } else { app.RenderError(404); } } }
internal static void RenderResource(string ns, string name, ExtensionType extType, string ext, Arguments args, Application app, Type type, Version version, bool html) { for (int i = 0; i < args.Count; ++i) { name = string.Concat(name, '.', args[i]); } string query = app.Context.Request.Url.Query; if (!string.IsNullOrEmpty(query) && query.StartsWith("??")) { if (query.Length > 2) { string path; ResourceHandler handler = null; string[] array = query.Substring(2).Split(','); string[] names = new string[array.Length]; for (int i = 0; i < array.Length; ++i) { path = array[i]; if (i == 0) { UrlParse p = new UrlParse(path); handler = ResourceHandler.Parse(p.ExtensionType, p.Extension, false); if (handler == null) { app.RenderError(404); return; } } names[i] = FormatName(ns, string.Concat(name, '.', path)); } RenderResource(names, handler.ContentType, app, type, version); } else { app.RenderError(404); } } else { ResourceHandler hander = ResourceHandler.Parse(extType, ext, html); if (hander != null) { RenderResource(FormatName(ns, name), hander.ContentType, app, type, version); } else { app.RenderError(404); } } }
private void RenderStatic(Application app, UrlParse parse, Uri url) { if (parse.IsDirectory) { if (parse.Segments.Count == 0 && parse.Extension == null) { ResourceHandler.Html.ProcessRequest(app.Context, app.Context.Server.MapPath(string.Concat(app.IsWap ? Utility.StaticWapDirF : Utility.StaticWwwDirF, Utility.DefaultController, Utility.DefaultExt))); } else { if (parse.Segments.Count > 0 && parse.Extension == null) { switch (parse.SegmentType) { case SegmentType.Themes: RenderResource(app, parse, url); break; case SegmentType.Resource: app.Run(parse); break; default: app.RenderError(404); break; } } else { app.RenderError(404); } } } else { if (parse.Segments.Count > 0) { if (parse.Extension != null) { switch (parse.SegmentType) { case SegmentType.Resource: parse.AppendExtension(); app.Run(parse); break; case SegmentType.Themes: case SegmentType.Uploads: RenderResource(app, parse, url); break; case SegmentType.Favicon: if (parse.Segments.Count == 1) { RenderResource(app, parse, ExtensionType.Ico, null); } break; case SegmentType.Robots: if (parse.Segments.Count == 1) { RenderResource(app, parse, ExtensionType.Txt, null); } break; case SegmentType.Sitemap: case SegmentType.CrossDomain: if (parse.Segments.Count == 1) { RenderResource(app, parse, ExtensionType.Xml, null); } break; case SegmentType.Caches: case SegmentType.Runtime: case SegmentType.Management: app.RenderError(404); break; case SegmentType.Admin: if (parse.ExtensionType != ExtensionType.Html) { parse.AppendExtension(); } parse.FormatManagement(); app.Run(parse); break; case SegmentType.Install: if (parse.ExtensionType != ExtensionType.Html) { parse.AppendExtension(); } app.Run(parse); break; default: if (parse.ExtensionType == ExtensionType.Html) { ResourceHandler.Html.ProcessRequest(app.Context, app.Context.Server.MapPath(string.Concat(app.IsWap ? Utility.StaticWapDir : Utility.StaticWwwDir, parse.Url))); } else { if (parse.Segments.Count > 3 && Utility.StaticString.Equals(parse.Segments[1], StringComparison.OrdinalIgnoreCase)) { parse.AppendExtension(); app.Run(parse); } else { app.RenderError(404); } } break; } } else { if (parse.SegmentType == SegmentType.Admin && parse.Segments.Count == 1) { parse.FormatManagement(); app.Run(parse); } else { app.RenderError(404); } } } else { app.RenderError(404); } } }
//private void RenderResource(Application app, UrlParse parse, params ExtensionType[] types) //{ // if (Array.BinarySearch<ExtensionType>(types, parse.ExtensionType) >= 0) // RenderResource(app, parse); // else // app.RenderError(404); //} private void RenderRewrite(Application app, UrlParse parse, Uri url) { if (parse.IsDirectory) { if (parse.Segments.Count == 0 && parse.Extension == null) { app.Run(parse); } else { if (parse.Segments.Count > 0 && parse.Extension == null) { switch (parse.SegmentType) { case SegmentType.Themes: RenderResource(app, parse, url); break; case SegmentType.Resource: app.Run(parse); break; default: app.RenderError(404); break; } } else { app.RenderError(404); } } } else { if (parse.Segments.Count > 0) { if (parse.Extension != null) { switch (parse.SegmentType) { case SegmentType.Resource: parse.AppendExtension(); app.Run(parse); break; case SegmentType.Themes: case SegmentType.Uploads: RenderResource(app, parse, url); break; case SegmentType.Favicon: if (parse.Segments.Count == 1) { RenderResource(app, parse, ExtensionType.Ico, null); } break; case SegmentType.Robots: if (parse.Segments.Count == 1) { RenderResource(app, parse, ExtensionType.Txt, null); } break; case SegmentType.Sitemap: case SegmentType.CrossDomain: if (parse.Segments.Count == 1) { RenderResource(app, parse, ExtensionType.Xml, null); } break; case SegmentType.Caches: case SegmentType.Runtime: case SegmentType.Management: app.RenderError(404); break; case SegmentType.Admin: if (parse.ExtensionType != ExtensionType.Html) { parse.AppendExtension(); } parse.FormatManagement(); app.Run(parse); break; case SegmentType.Install: if (parse.ExtensionType != ExtensionType.Html) { parse.AppendExtension(); } app.Run(parse); break; default: if (parse.ExtensionType == ExtensionType.Html) { app.Run(parse); } else { if (parse.Segments.Count > 3 && Utility.StaticString.Equals(parse.Segments[1], StringComparison.OrdinalIgnoreCase)) { parse.AppendExtension(); app.Run(parse); } else { app.RenderError(404); } } break; } } else { if (parse.SegmentType == SegmentType.Admin && parse.Segments.Count == 1) { parse.FormatManagement(); app.Run(parse); } else { app.RenderError(404); } } } else { app.RenderError(404); } } }
internal void Run(UrlParse parse) { Reset(); if (parse.Segments.Count > 0) { _ctlName = parse.Segments[0]; } else { _ctlName = Utility.DefaultController; } _controller = CreateController(_ctlName); if (_controller == null) { throw new DebugException(string.Concat("Controller \"", _ctlName, "\" can not defined")); } try { _controller.InitController(this, parse.Url, parse.ExtensionType, parse.Extension); if (parse.Segments.Count > 1) { _actName = parse.Segments[1]; } else { _actName = Utility.DefaultAction; } bool isDefault = false; MethodInfo method = _controller.GetType().GetMethod(_actName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.IgnoreCase); if (method == null) { method = _controller.GetType().GetMethod(Utility.NormalAction, BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.IgnoreCase); if (method != null) { isDefault = true; } else { throw new DebugException(string.Concat("Action \"", _ctlName, ".", _actName, "\" can not defined")); } } Type type; object[] attrs = method.GetCustomAttributes(true); foreach (object attr in attrs) { if (attr != null) { type = attr.GetType(); if (TType <ActionMethodSelectorAttribute> .Type.IsAssignableFrom(type)) { ActionMethodSelectorAttribute selector = (ActionMethodSelectorAttribute)attr; if (!selector.IsValidForRequest(_controller, method)) { if (TType <AuthorizeAttribute> .Type.IsAssignableFrom(type)) { _controller.Unauthorized(((AuthorizeAttribute)attr).Redirect); } else { _controller.NotFound(); } goto EndLine; } } } } int argsn = 0; object[] args = null; ParameterInfo[] ps = method.GetParameters(); if (ps != null) { argsn = ps.Length; } bool hasArgs = (ps.Length > 0 && ps[ps.Length - 1].ParameterType == TType <Arguments> .Type); if (!isDefault && (parse.Segments.Count - 2) > argsn && !hasArgs) { StringBuilder sb = new StringBuilder(string.Concat("Action \"", _ctlName, ".", _actName, "(")); for (int i = 0; i < ps.Length; ++i) { if (i > 0) { sb.Append(", "); } sb.Append(ps[i].ParameterType.Name); } sb.Append(")\" 参数不匹配"); throw new DebugException(sb.ToString()); } if (argsn > 0) { int x; string s; int setp = 2; int begin = 0; args = new object[argsn]; if (isDefault) { setp = 1; begin = 1; args[0] = _actName; } for (int i = begin; i < argsn; ++i) { x = i + setp; if (hasArgs && i == (argsn - 1)) { args[i] = new Arguments(parse.Segments, x); } else { if (x < parse.Segments.Count) { s = parse.Segments[x]; } else { s = null; } args[i] = FormatParameter(ps[i], s); } } } _action = string.Concat(_ctlName, ".", _actName).ToLower(); method.Invoke(_controller, args); EndLine: _controller.End(); } finally { ReleaseController(); } }