/// <summary> /// Properly routes the current virtual request to a physical ASP.NET page. /// </summary> public static void RouteCurrentRequest( ) { string physicalPath; try { physicalPath = HttpContext.Current.Request.PhysicalPath; } catch (ArgumentException) { // Illegal characters in path HttpContext.Current.Response.Redirect("~/PageNotFound.aspx"); return; } // Extract the physical page name, e.g. MainPage, Edit or Category string pageName = Path.GetFileNameWithoutExtension(physicalPath); // Exctract the extension, e.g. .ashx or .aspx var extension = Path.GetExtension(HttpContext.Current.Request.PhysicalPath); if (extension == null) { //If extension null, nothing to do. return; } string ext = extension.ToLowerInvariant( ); // Remove trailing dot, .ashx -> ashx if (ext.Length > 0) { ext = ext.Substring(1); } // IIS7+Integrated Pipeline handles all requests through the ASP.NET engine // All non-interesting files are not processed, such as GIF, CSS, etc. if (ext != "ashx" && ext != "aspx") { return; } // Extract the current namespace, if any string nspace = UrlTools.GetCurrentNamespace( ) + ""; if (!string.IsNullOrEmpty(nspace)) { // Verify that namespace exists if (Pages.FindNamespace(nspace) == null) { HttpContext.Current.Response.Redirect("~/PageNotFound.aspx?Page=" + pageName); } } // Trim Namespace. from pageName if (!string.IsNullOrEmpty(nspace)) { pageName = pageName.Substring(nspace.Length + 1); } string queryString = ""; // Empty or begins with ampersand, not question mark try { // This might throw exceptions if 3rd-party modules interfer with the request pipeline queryString = HttpContext.Current.Request.Url.Query.Replace("?", "&"); // Host not used } catch { } if (ext.Equals("ashx")) { // Content page requested, process it via Default.aspx if (!queryString.Contains("NS=")) { HttpContext.Current.RewritePath("~/Default.aspx?Page=" + Tools.UrlEncode(pageName) + "&NS=" + Tools.UrlEncode(nspace) + queryString); } else { HttpContext.Current.RewritePath("~/Default.aspx?Page=" + Tools.UrlEncode(pageName) + queryString); } } else if (ext.Equals("aspx")) { // System page requested, redirect to the root of the application // For example: http://www.server.com/Namespace.Edit.aspx?Page=MainPage -> http://www.server.com/Edit.aspx?Page=MainPage&NS=Namespace if (!string.IsNullOrEmpty(nspace)) { if (!queryString.Contains("NS=")) { HttpContext.Current.RewritePath("~/" + Tools.UrlEncode(pageName) + "." + ext + "?NS=" + Tools.UrlEncode(nspace) + queryString); } else { if (queryString.Length > 1) { queryString = "?" + queryString.Substring(1); } HttpContext.Current.RewritePath("~/" + Tools.UrlEncode(pageName) + "." + ext + queryString); } } } // else nothing to do }