/// <summary> /// Removes the rock page and default routes from RouteTable.Routes but leaves the ones created by ODataService. /// </summary> public static void RemoveRockPageRoutes() { RouteCollection routes = RouteTable.Routes; PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext()); var pageRoutes = pageRouteService.Queryable().ToList(); // First we have to remove the routes stored in the DB without removing the ODataService routes because we can't reload them. // Routes that were removed from the DB have already been removed from the RouteTable in PreSaveChanges() foreach (var pageRoute in pageRoutes) { var route = routes.OfType <Route>().Where(a => a.Url == pageRoute.Route).FirstOrDefault(); if (route != null) { routes.Remove(route); } } // Remove the shortlink route var shortLinkRoute = routes.OfType <Route>().Where(r => r.Url == "{shortlink}").FirstOrDefault(); if (shortLinkRoute != null) { routes.Remove(shortLinkRoute); } // Remove the page route var pageIdRoute = routes.OfType <Route>().Where(r => r.Url == "page/{PageId}").FirstOrDefault(); if (pageIdRoute != null) { routes.Remove(pageIdRoute); } // Remove the default route for when no parameters are passed var defaultRoute = routes.OfType <Route>().Where(r => r.Url == "").FirstOrDefault(); if (defaultRoute != null) { routes.Remove(pageIdRoute); } // Remove scriptmanager ignore route var scriptmanagerRoute = routes.OfType <Route>().Where(r => r.Url == "{resource}.axd/{*pathInfo}").FirstOrDefault(); if (scriptmanagerRoute != null) { routes.Remove(scriptmanagerRoute); } }
public static Route RegisterDefaultRoutes(this RouteCollection @this, string url, object defaults, string[] namespaces, Assembly resourceAssembly, string applicationDefaultNamespace) { Contract.Requires(@this != null); @this.RouteExistingFiles = true; var defaultRouteName = @default; var defaultScriptResourceRouteName = ResourceRouteHandler.GetDefaultResourceRouteName(ResourceRouteHandler.DefaultFolders.Scripts); var defaultContentResourceRouteName = ResourceRouteHandler.GetDefaultResourceRouteName(ResourceRouteHandler.DefaultFolders.Content); var constraints = ResourceRouteHandler.CreateControllerExcludeConstraintForDefaultFolders(); var defaultRoute = @this.MapRoute(defaultRouteName, url, defaults, constraints, namespaces); defaultRoute.DataTokens[ResourceRouteHandler.DataTokens.defaultScriptResourceRouteName] = defaultScriptResourceRouteName; defaultRoute.DataTokens[ResourceRouteHandler.DataTokens.defaultContentResourceRouteName] = defaultContentResourceRouteName; var areaRoutes = @this .OfType <Route>() .Where(r => r.IsAreaDefaultRoute()); foreach (var areaRoute in areaRoutes) { areaRoute.DataTokens[ResourceRouteHandler.DataTokens.defaultScriptResourceRouteName] = defaultScriptResourceRouteName; areaRoute.DataTokens[ResourceRouteHandler.DataTokens.defaultContentResourceRouteName] = defaultContentResourceRouteName; areaRoute.DataTokens[DefaultRouteConstants.defaultRouteName] = defaultRouteName; } ResourceRouteHandler.RegisterResourceRoute(@this.MapRoute, defaultScriptResourceRouteName, ResourceRouteHandler.DefaultFolders.Scripts, resourceAssembly, applicationDefaultNamespace); ResourceRouteHandler.RegisterResourceRoute(@this.MapRoute, defaultContentResourceRouteName, ResourceRouteHandler.DefaultFolders.Content, resourceAssembly, applicationDefaultNamespace); return(defaultRoute); }
/// <summary> /// Finds the namespaces for area. /// </summary> /// <param name="area">The area.</param> /// <param name="routes">The routes.</param> /// <returns> /// A namespaces for area represented as a <see cref="string"/> instance /// </returns> protected virtual IEnumerable <string> FindNamespacesForArea(string area, RouteCollection routes) { var namespacesForArea = new List <string>(); var namespacesCommon = new List <string>(); foreach (var route in routes.OfType <Route>().Where(r => r.DataTokens != null && r.DataTokens["Namespaces"] != null)) { // search for area-based namespaces if (route.DataTokens["area"] != null && route.DataTokens["area"].ToString().Equals(area, StringComparison.OrdinalIgnoreCase)) { namespacesForArea.AddRange((IEnumerable <string>)route.DataTokens["Namespaces"]); } else if (route.DataTokens["area"] == null) { namespacesCommon.AddRange((IEnumerable <string>)route.DataTokens["Namespaces"]); } } if (namespacesForArea.Count > 0) { return(namespacesForArea); } else if (namespacesCommon.Count > 0) { return(namespacesCommon); } return(null); }
public ForkListener(RouteCollection <TProducer> routes, IForkSubscriber subscriber, IForkHandlerMiddleware middleware) { _routes = routes.OfType <InputOutputRoute>().Where(e => e.ToProducer == typeof(TProducer)).ToArray(); _middleware = middleware; _subscriber = subscriber; _subscriptions = new List <IDisposable>(); }
public static void IgnoreStandardExclusions(this RouteCollection routes) { // Ignore standard stuff... using (routes.GetWriteLock()) { var exclusions = new Dictionary <string, object>() { { "{resource}.axd/{*pathInfo}", null }, { "{*allaxd}", new { allaxd = @".*\.axd(/.*)?" } }, { "{*allashx}", new { allashx = @".*\.ashx(/.*)?" } }, { "{*allaspx}", new { allaspx = @".*\.aspx(/.*)?" } }, { "{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" } }, }; //ensure they're not re-added foreach (var e in exclusions.Where(e => !routes.OfType <Route>().Any(x => x.Url == e.Key))) { if (e.Value == null) { routes.IgnoreRoute(e.Key); } else { routes.IgnoreRoute(e.Key, e.Value); } } } }
public override TaskContinuation Execute() { IList <string> reservedAliases = new List <string>(); Action <string> addIfNotExists = name => { if (!reservedAliases.Contains(name, StringComparer.OrdinalIgnoreCase) && !reservedAliasRepository.IsMatching(name)) { reservedAliases.Add(name); } }; foreach (Route route in routes.OfType <Route>()) { string[] urlSegments = route.Url.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (urlSegments.Any()) { string firstSegment = urlSegments.First(); if (firstSegment.StartsWith("{", StringComparison.Ordinal) && firstSegment.EndsWith("}", StringComparison.Ordinal)) { // Special Values, but we will only consider the the Controllers if (firstSegment.Equals("{controller}", StringComparison.OrdinalIgnoreCase)) { IEnumerable <Type> controllerTypes = GetType().Assembly.ConcreteTypes().Where(type => controllerType.IsAssignableFrom(type)); foreach (Type controller in controllerTypes) { string controllerName = controller.Name.Substring(0, controller.Name.Length - "Controller".Length); addIfNotExists(controllerName); } } } else if (!firstSegment.StartsWith("{", StringComparison.Ordinal) && !firstSegment.EndsWith("}", StringComparison.Ordinal)) { // Constant values addIfNotExists(firstSegment); } } } bool shouldCommit = false; foreach (string aliasName in reservedAliases.OrderBy(ra => ra)) { reservedAliasRepository.Add(new ReservedAlias { Name = aliasName }); shouldCommit = true; } if (shouldCommit) { unitOfWork.Commit(); } return(TaskContinuation.Continue); }
public void Publish(IEnumerable <RouteDescriptor> routes) { var routesArray = routes .OrderByDescending(r => r.Priority) .ToArray(); // this is not called often, but is intended to surface problems before // the actual collection is modified var preloading = new RouteCollection(); foreach (var route in routesArray) { preloading.Add(route.Name, route.Route); } using (_routeCollection.GetWriteLock()) { // existing routes are removed while the collection is briefly inaccessable var cropArray = _routeCollection .OfType <ShellRoute>() .Where(sr => sr.ShellSettingsName == _shellSettings.Name) .ToArray(); foreach (var crop in cropArray) { _routeCollection.Remove(crop); } // new routes are added foreach (var routeDescriptor in routesArray) { var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable); _routeCollection.Add(routeDescriptor.Name, shellRoute); } } }
/// <inheritdoc/> public override IEnumerator <IHttpRoute> GetEnumerator() { // Here we only care about Web API routes. return(_routeCollection .OfType <HttpWebRoute>() .Select(httpWebRoute => httpWebRoute.HttpRoute) .GetEnumerator()); }
void RenderRoutesVB(RouteCollection routes) { if (routes == null) { throw new ArgumentNullException("routes"); } writer.Write("<!DOCTYPE html>"); writer.Write("<html>"); RenderHtmlHead(); writer.Write("<body class='vb'>"); RenderTopComments("'"); writer.WriteLine(); string prevRouteContext = null; foreach (Route route in routes.OfType <Route>()) { string routeContext = (route.DataTokens != null) ? route.DataTokens[DataTokenKeys.RouteContext] as string : null; if (routeContext != prevRouteContext) { if (prevRouteContext != null) { writer.WriteLine(); writer.WriteLine("<span class='keyword'>#End Region</span>"); } if (routeContext != null) { string display = routeContext.Length == 0 ? "(root)" : routeContext; writer.WriteLine(); writer.Write("<span class='keyword'>#Region</span> "); writer.Write(ValueToVBString(display)); writer.WriteLine(); } } writer.WriteLine(); RenderRouteVB(route); prevRouteContext = routeContext; } if (prevRouteContext != null) { writer.WriteLine(); writer.Write("<span class='keyword'>#End Region</span>"); } writer.Write("</body>"); writer.Write("</html>"); }
public static Route ForAction(this RouteCollection routes, string controller, string action) { var matches = routes.OfType <Route>().Where(r => controller.Equals((string)r.Defaults["controller"], StringComparison.InvariantCultureIgnoreCase) && action.Equals((string)r.Defaults["action"], StringComparison.InvariantCultureIgnoreCase)) .ToList(); matches.Count.ShouldEqual(1); return(matches.First()); }
public void TestBuildHttpRouteTable() { var routes = new RouteCollection(); HttpRouteTableBuilder.BuildTable(routes,typeof(HttpRouteTableBuilderTests).Assembly); // Check that the HTTP route table is build correctly Assert.AreEqual(3,routes.Count); Assert.IsTrue(routes.OfType<HttpWebRoute>().Any(route => route.Url == "api/methodlevel/route/{id}")); Assert.IsTrue(routes.OfType<HttpWebRoute>().Any(route => route.Url == "api/subroute/controller")); Assert.IsTrue(routes.OfType<HttpWebRoute>().Any(route => route.Url == "api/methodlevel/basic")); // Find the route with optional url parameters var routeWithParameters = routes.OfType<HttpWebRoute>() .FirstOrDefault(route => route.Url == "api/methodlevel/route/{id}"); // Check that the ID parameter is indeed marked as optional. Assert.IsNotNull(routeWithParameters); Assert.AreEqual(RouteParameter.Optional, routeWithParameters.Defaults["id"]); }
public void should_register_routes_in_order_of_the_number_of_their_inputs() { routes.OfType <Route>().Select(r => r.Url).ShouldHaveTheSameElementsAs( "area/sub2/prop", "area/sub4/some_pattern", "area/sub2/{Name}", "area/sub/{Name}/{Age}", "area/sub2/{Name}/{Age}", "area/sub3/{Name}/{Age}"); }
public void TestBuildHttpRouteTable() { var routes = new RouteCollection(); HttpRouteTableBuilder.BuildTable(routes, typeof(HttpRouteTableBuilderTests).Assembly); // Check that the HTTP route table is build correctly Assert.AreEqual(3, routes.Count); Assert.IsTrue(routes.OfType <HttpWebRoute>().Any(route => route.Url == "api/methodlevel/route/{id}")); Assert.IsTrue(routes.OfType <HttpWebRoute>().Any(route => route.Url == "api/subroute/controller")); Assert.IsTrue(routes.OfType <HttpWebRoute>().Any(route => route.Url == "api/methodlevel/basic")); // Find the route with optional url parameters var routeWithParameters = routes.OfType <HttpWebRoute>() .FirstOrDefault(route => route.Url == "api/methodlevel/route/{id}"); // Check that the ID parameter is indeed marked as optional. Assert.IsNotNull(routeWithParameters); Assert.AreEqual(RouteParameter.Optional, routeWithParameters.Defaults["id"]); }
public static void RegisterNoAccountRoutes(RouteCollection routes) { RegisterRoutes(routes); // deregister the non SPA MVC route, and replace it with a redirect to Functions Homepage so // the user would get the helpful error. var legacyRoute = routes.OfType <Route>().First(r => r.Url == FunctionController.LegacyNonSpaRouteUrl); routes.Remove(legacyRoute); routes.Add(new Route(FunctionController.LegacyNonSpaRouteUrl, new RedirectRouteHandler("~/#/functions"))); }
public void ExplosionLeavesOriginalRoutesIntact() { _routes.MapRoute("foo", "{controller}"); var publisher = _container.Resolve <IRoutePublisher>(); try { publisher.Publish(new[] { Desc("yarg", "bar"), Desc("yarg", "quux") }); } catch (ArgumentException) { Assert.That(_routes.Count(), Is.EqualTo(1)); Assert.That(_routes.OfType <Route>().Single().Url, Is.EqualTo("{controller}")); } }
public static void RegisterNoAccountRoutes(RouteCollection routes) { if (routes == null) { throw new ArgumentNullException("routes"); } RegisterRoutes(routes); // deregister the non SPA MVC route, and replace it with a redirect to Functions Homepage so // the user would get the helpful error. var legacyRoute = routes.OfType<Route>().First(r => r.Url == FunctionController.LegacyNonSpaRouteUrl); routes.Remove(legacyRoute); routes.Add(new Route(FunctionController.LegacyNonSpaRouteUrl, new RedirectRouteHandler("~/#/functions"))); }
public static IEnumerable<NamedRoute> GetRoutesForCurrentRequest(RouteCollection routes,IEnumerable<INavigationRouteFilter> routeFilters) { var navigationRoutes = routes.OfType<NamedRoute>().Where(r=> !r.IsChild).ToList(); if (routeFilters.Any()) { foreach (var route in navigationRoutes.ToArray()) { if (routeFilters.Any(filter => filter.ShouldRemove(route))) { navigationRoutes.Remove(route); } } } return navigationRoutes; }
/// <summary> /// <para>Assign route handler to all routes passed</para> /// </summary> /// <param name = "routes">Routes</param> public static void Assign(RouteCollection routes) { using (routes.GetReadLock()) { var routeHandler = new RouteHandler <THttpHandler>( ControllerBuilder.Current.GetControllerFactory()); foreach (var route in routes .OfType <Route>() .Where(r => (r.RouteHandler is MvcRouteHandler))) { route.RouteHandler = routeHandler; } } }
public IEnumerable<RouteDefinition> GetRouteTable(RouteCollection routes) { List<RouteDefinition> collection = new List<RouteDefinition>(); RouteReader reader = CreateReader(new IRouteInterceptor[] { new RegexConstraintReader(), new RouteVariableAssigner(routes.Variables) }); foreach (Route route in routes.OfType<Route>()) { RouteDefinition definition = reader.Read(route); if (definition != null) collection.Add(definition); } return collection; }
/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { RouteCollection routes = RouteTable.Routes; PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext()); var pageRoutes = pageRouteService.Queryable().ToList(); // Check to see if we have any missing routes. If so, simply run reregister. foreach (var pageRoute in pageRoutes) { var route = routes.OfType <Route>().Where(a => a.Url == pageRoute.Route && a.PageIds().Contains(pageRoute.PageId)).FirstOrDefault(); if (route == null) { nbNotification.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning; nbNotification.Text = "Routes were out-of-date. Running reregister routes."; ReRegisterRoutes(); break; } } // Check to see if we have any missing shortcodes var outOfDate = RockDateTime.Now.AddMinutes(-30); var sc = new LavaShortcodeService(new Rock.Data.RockContext()).Queryable().Where(l => l.CreatedDateTime > outOfDate || l.ModifiedDateTime > outOfDate).ToList(); if (sc.Count > 0) { nbNotification.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning; nbNotification.Text = "Shortcodes were out-of-date. Running register shortcodes. " + sc.Count; foreach (var code in sc) { // register shortcode if (code.TagType == TagType.Block) { Template.RegisterShortcode <DynamicShortcodeBlock>(code.TagName); } else { Template.RegisterShortcode <DynamicShortcodeInline>(code.TagName); } } LavaShortcodeCache.Clear(); } }
/// <summary> /// 获取内建的简单路由表实例,如果没有则创建一个。 /// </summary> /// <param name="routes">系统路由集合</param> /// <returns>内建的简单路由表实例</returns> public static SimpleRouteTable SimpleRouteTable(this RouteCollection routes) { if (routes == null) { throw new ArgumentNullException("routes"); } lock ( routes ) { var routeTable = routes.OfType <SimpleRouteTable>().FirstOrDefault(route => route.IsBuiltIn); if (routeTable == null) { routes.RegisterSimpleRouteTable(routeTable = new SimpleRouteTable()); } return(routeTable); } }
/// <summary> /// 获取内建的简单路由表实例,如果没有则创建一个。 /// </summary> /// <param name="routes">系统路由集合</param> /// <returns>内建的简单路由表实例</returns> public static SimpleRouteTable SimpleRouteTable(this RouteCollection routes) { if (routes == null) { throw new ArgumentNullException("routes"); } lock ( routes ) { var routeTable = routes.OfType <SimpleRouteTable>().FirstOrDefault(route => route.Name == "Mvc_BuiltIn"); if (routeTable == null) { routes.Add(routeTable = new SimpleRouteTable("Mvc_BuiltIn", new MvcRouteHandler(), true)); } return(routeTable); } }
private static void MapRoutes(RouteCollection routes) { // The default route is http://{root}/nuget/Packages var factory = new DataServiceHostFactory(); var serviceRoute = new ServiceRoute("nuget", factory, typeof(Packages)); serviceRoute.Defaults = new RouteValueDictionary { { "serviceType", "odata" } }; serviceRoute.Constraints = new RouteValueDictionary { { "serviceType", "odata" } }; routes.Add("nuget", serviceRoute); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); // For some godforsaken reason, the PublishPackage route (registered by NuGet.Server) causes the { controller, action } => url mapping to always return this route. routes.Remove(routes.OfType<Route>().Single(r => r.DataTokens != null && r.DataTokens.ContainsKey("__RouteName") && (string)r.DataTokens["__RouteName"] == "PublishPackage")); }
/// <summary> /// 检查规则是否与任何简单路由表冲突 /// </summary> /// <param name="routes">路由集合</param> /// <param name="rule">要检查的简单路由规则</param> /// <returns>如果有冲突,返回冲突的规则</returns> public static SimpleRouteRule CheckConflict(this RouteCollection routes, SimpleRouteRule rule) { if (routes == null) { throw new ArgumentNullException("routes"); } if (rule == null) { throw new ArgumentNullException("rule"); } lock ( routes ) { return(routes.OfType <SimpleRouteTable>().Select(routeTable => routeTable.CheckConflict(rule)).NotNull().FirstOrDefault()); } }
public IEnumerable <RouteDefinition> GetRouteTable(RouteCollection routes) { List <RouteDefinition> collection = new List <RouteDefinition>(); RouteReader reader = CreateReader(new IRouteInterceptor[] { new RegexConstraintReader(), new RouteVariableAssigner(routes.Variables) }); foreach (Route route in routes.OfType <Route>()) { RouteDefinition definition = reader.Read(route); if (definition != null) { collection.Add(definition); } } return(collection); }
protected void ReRegisterRoutes() { RouteCollection routes = RouteTable.Routes; var routesToDelete = routes.OfType <Route>().Where(r => r.RouteHandler is Rock.Web.RockRouteHandler).ToList(); foreach (Route oldRoute in routesToDelete) { routes.Remove(oldRoute); } PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext()); var routesToInsert = new RouteCollection(); // Add ignore rule for asp.net ScriptManager files. routesToInsert.Ignore("{resource}.axd/{*pathInfo}"); //Add page routes, order is very important here as IIS takes the first match IOrderedEnumerable <PageRoute> pageRoutes = pageRouteService.Queryable().AsNoTracking().ToList().OrderBy(r => r.Route, StringComparer.OrdinalIgnoreCase); foreach (var pageRoute in pageRoutes) { routesToInsert.AddPageRoute(pageRoute.Route, new Rock.Web.PageAndRouteId { PageId = pageRoute.PageId, RouteId = pageRoute.Id }); } // Add a default page route routesToInsert.Add(new Route("page/{PageId}", new Rock.Web.RockRouteHandler())); // Add a default route for when no parameters are passed routesToInsert.Add(new Route("", new Rock.Web.RockRouteHandler())); // Add a default route for shortlinks routesToInsert.Add(new Route("{shortlink}", new Rock.Web.RockRouteHandler())); // Insert the list of routes to the beginning of the Routes so that PageRoutes, etc are before OdataRoutes. Even when Re-Registering routes // Since we are inserting at 0, reverse the list to they end up in the original order foreach (var pageRoute in routesToInsert.Reverse()) { routes.Insert(0, pageRoute); } }
public static IEnumerable<NamedRoute> GetRoutesForCurrentRequest(RouteCollection routes,IEnumerable<INavigationRouteFilter> routeFilters) { var navigationRoutes = routes.OfType<NamedRoute>().ToList(); if (routeFilters.Count() > 0) { foreach (var route in navigationRoutes.ToArray()) { foreach (var filter in routeFilters) { if (filter.ShouldRemove(route)) { navigationRoutes.Remove(route); break; } } } } return navigationRoutes; }
public static IEnumerable <NamedRoute> GetRoutesForCurrentRequest(RouteCollection routes, IEnumerable <INavigationRouteFilter> routeFilters) { var navigationRoutes = routes.OfType <NamedRoute>().Where(r => r.IsChild == false).ToList(); if (routeFilters.Count() > 0) { foreach (var route in navigationRoutes.ToArray()) { foreach (var filter in routeFilters) { if (filter.ShouldRemove(route)) { navigationRoutes.Remove(route); break; } } } } return(navigationRoutes); }
public static void RegisterRoutes(RouteCollection routes) { //routes.MapAttributeRoutes(); foreach (var route in routes.OfType<Route>()) { if(route.DataTokens == null) continue; var namespaces = route.DataTokens["namespaces"] as string[]; if (namespaces != null) { route.Url = Regex.Match(namespaces[0], "^SymbolSource.Gateway.([^.]+).Core$").Groups[1] + "/" + route.Url; ReplaceToken(route, "login", "Basic"); ReplaceToken(route, "company", "Basic"); ReplaceToken(route, "password", "Basic"); ReplaceToken(route, "repository", "Basic"); } } }
/// <summary> /// Raises the <see cref="E:System.Web.UI.Control.Load" /> event. /// </summary> /// <param name="e">The <see cref="T:System.EventArgs" /> object that contains the event data.</param> protected override void OnLoad(EventArgs e) { RouteCollection routes = RouteTable.Routes; PageRouteService pageRouteService = new PageRouteService(new Rock.Data.RockContext()); var pageRoutes = pageRouteService.Queryable().ToList(); // Check to see if we have any missing routes. If so, simply run reregister. foreach (var pageRoute in pageRoutes) { var route = routes.OfType <Route>().Where(a => a.Url == pageRoute.Route && a.PageIds().Contains(pageRoute.PageId)).FirstOrDefault(); if (route == null) { nbNotification.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Warning; nbNotification.Text = "Routes were out-of-date. Running reregister routes."; ReRegisterRoutes(); break; } } }
private static void MapRoutes(RouteCollection routes) { // The default route is http://{root}/nuget/Packages var factory = new DataServiceHostFactory(); var serviceRoute = new ServiceRoute("nuget", factory, typeof(Packages)); serviceRoute.Defaults = new RouteValueDictionary { { "serviceType", "odata" } }; serviceRoute.Constraints = new RouteValueDictionary { { "serviceType", "odata" } }; routes.Add("nuget", serviceRoute); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); // For some godforsaken reason, the PublishPackage route (registered by NuGet.Server) causes the { controller, action } => url mapping to always return this route. routes.Remove(routes.OfType <Route>().Single(r => r.DataTokens != null && r.DataTokens.ContainsKey("__RouteName") && (string)r.DataTokens["__RouteName"] == "PublishPackage")); }
public void Publish(IEnumerable <RouteDescriptor> routes) { var routesArray = routes.OrderByDescending(r => r.Priority).ToArray(); // this is not called often, but is intended to surface problems before // the actual collection is modified var preloading = new RouteCollection(); foreach (var route in routesArray) { preloading.Add(route.Name, route.Route); } using (_routeCollection.GetWriteLock()) { // existing routes are removed while the collection is briefly inaccessable var cropArray = _routeCollection .OfType <ShellRoute>() .ToArray(); foreach (var crop in cropArray) { _routeCollection.Remove(crop); } var urls = "<table>"; // new routes are added foreach (var routeDescriptor in routesArray) { var route = (Route)routeDescriptor.Route; urls += string.Format("<tr><td>{0}</td><td>{1}</td></tr>", route.Url, routeDescriptor.Priority) + Environment.NewLine; _routeCollection.Add(routeDescriptor.Name, _shellRouteFactory(routeDescriptor.Route)); } var sss = urls + "</table>"; } }
/// <summary> /// Finds the namespaces for area. /// </summary> /// <param name="area">The area.</param> /// <param name="routes">The routes.</param> /// <returns> /// A namespaces for area represented as a <see cref="string"/> instance /// </returns> protected IEnumerable<string> FindNamespacesForArea(string area, RouteCollection routes) { var namespacesForArea = new List<string>(); var namespacesCommon = new List<string>(); foreach (var route in routes.OfType<Route>().Where(r => r.DataTokens != null && r.DataTokens["Namespaces"] != null)) { // search for area-based namespaces if (route.DataTokens["area"] != null && route.DataTokens["area"].ToString().Equals(area, StringComparison.OrdinalIgnoreCase)) namespacesForArea.AddRange((IEnumerable<string>)route.DataTokens["Namespaces"]); else if (route.DataTokens["area"] == null) namespacesCommon.AddRange((IEnumerable<string>)route.DataTokens["Namespaces"]); } if (namespacesForArea.Count > 0) { return namespacesForArea; } else if (namespacesCommon.Count > 0) { return namespacesCommon; } return null; }
public static IEnumerable <Route> ForController(this RouteCollection routes, string controller) { return(routes.OfType <Route>().Where(r => controller.Equals((string)r.Defaults["controller"], StringComparison.InvariantCultureIgnoreCase))); }
private static IEnumerable<Tuple<string, string>> GetAreaNameAndNamespace(RouteCollection routeEntries) { var areas = routeEntries .OfType<Route>() .Where(x => x.DataTokens != null) .Where(x => x.DataTokens.Any(token => token.Key == "area")) .Select(x => Tuple.Create(ExtractSingleValue(x.DataTokens["area"]), ExtractSingleValue(x.DataTokens["Namespaces"]).Replace("*", "").TrimEnd('.'))) ; return areas.ToArray(); }
void RenderRoutesVB(RouteCollection routes) { if (routes == null) throw new ArgumentNullException("routes"); writer.Write("<!DOCTYPE html>"); writer.Write("<html>"); RenderHtmlHead(); writer.Write("<body class='vb'>"); RenderTopComments("'"); writer.WriteLine(); string prevRouteContext = null; foreach (Route route in routes.OfType<Route>()) { string routeContext = (route.DataTokens != null) ? route.DataTokens[DataTokenKeys.RouteContext] as string : null; if (routeContext != prevRouteContext) { if (prevRouteContext != null) { writer.WriteLine(); writer.WriteLine("<span class='keyword'>#End Region</span>"); } if (routeContext != null) { string display = routeContext.Length == 0 ? "(root)" : routeContext; writer.WriteLine(); writer.Write("<span class='keyword'>#Region</span> "); writer.Write(ValueToVBString(display)); writer.WriteLine(); } } writer.WriteLine(); RenderRouteVB(route); prevRouteContext = routeContext; } if (prevRouteContext != null) { writer.WriteLine(); writer.Write("<span class='keyword'>#End Region</span>"); } writer.Write("</body>"); writer.Write("</html>"); }
public override IEnumerator <IHttpRoute> GetEnumerator() => _routeCollection.OfType <HttpWebRoute>().Select(r => r.HttpRoute).GetEnumerator();
public void Publish(IEnumerable <RouteDescriptor> routes, Func <IDictionary <string, object>, Task> env) { var routesArray = routes .OrderByDescending(r => r.Priority) .ToArray(); // this is not called often, but is intended to surface problems before // the actual collection is modified var preloading = new RouteCollection(); foreach (var routeDescriptor in routesArray) { // extract the WebApi route implementation var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor; if (httpRouteDescriptor != null) { var httpRouteCollection = new RouteCollection(); httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults, httpRouteDescriptor.Constraints); routeDescriptor.Route = httpRouteCollection.First(); } preloading.Add(routeDescriptor.Name, routeDescriptor.Route); } using (_routeCollection.GetWriteLock()) { // existing routes are removed while the collection is briefly inaccessable _routeCollection .OfType <HubRoute>() .ToList().ForEach(x => x.ReleaseShell(_shellSettings)); // HACK: For inserting names in internal dictionary when inserting route to RouteCollection. var routeCollectionType = typeof(RouteCollection); var namedMap = (Dictionary <string, RouteBase>)routeCollectionType.GetField("_namedMap", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_routeCollection); // new routes are added foreach (var routeDescriptor in routesArray) { // Loading session state information. var defaultSessionState = SessionStateBehavior.Default; ExtensionDescriptor extensionDescriptor = null; if (routeDescriptor.Route is Route) { object extensionId; var route = routeDescriptor.Route as Route; if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) || route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId)) { extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString()); } } else if (routeDescriptor.Route is IRouteWithArea) { var route = routeDescriptor.Route as IRouteWithArea; extensionDescriptor = _extensionManager.GetExtension(route.Area); } if (extensionDescriptor != null) { // if session state is not define explicitly, use the one define for the extension if (routeDescriptor.SessionState == SessionStateBehavior.Default) { Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState); } } // Route-level setting overrides module-level setting (from manifest). var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState; var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable, env) { IsHttpRoute = routeDescriptor is HttpRouteDescriptor, SessionState = sessionStateBehavior }; var area = extensionDescriptor == null ? "" : extensionDescriptor.Id; var matchedHubRoute = _routeCollection.FirstOrDefault(x => { var hubRoute = x as HubRoute; if (hubRoute == null) { return(false); } return(routeDescriptor.Priority == hubRoute.Priority && hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) && hubRoute.Name == routeDescriptor.Name); }) as HubRoute; if (matchedHubRoute == null) { matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority, _runningShellTable); int index; for (index = 0; index < _routeCollection.Count; index++) { var hubRoute = _routeCollection[index] as HubRoute; if (hubRoute == null) { continue; } if (hubRoute.Priority < matchedHubRoute.Priority) { break; } } _routeCollection.Insert(index, matchedHubRoute); // HACK: For inserting names in internal dictionary when inserting route to RouteCollection. if (!string.IsNullOrEmpty(matchedHubRoute.Name) && !namedMap.ContainsKey(matchedHubRoute.Name)) { namedMap[matchedHubRoute.Name] = matchedHubRoute; } } matchedHubRoute.Add(shellRoute, _shellSettings); } } }
private IReadOnlyCollection<RouteBase> GetAttributeRoutes(RouteCollection routes) { return routes.OfType<IReadOnlyCollection<RouteBase>>().Single(); }
/// <summary> /// 发布路由。 /// </summary> /// <param name="routes">路由集合。</param> public void Publish(IEnumerable <RouteDescriptor> routes) { //排序。 var routesArray = routes .OrderByDescending(r => r.Priority) .ToArray(); //发布前事件。 _routePublisherEventHandlers.Invoke(i => i.Publishing(routesArray), NullLogger.Instance); using (_routeCollection.GetWriteLock()) { //释放现有路由。 _routeCollection .OfType <HubRoute>().Invoke(x => x.ReleaseShell(_shellSettings), NullLogger.Instance); var routeList = new List <RouteBase>(_routeCollection); //添加新路由 foreach (var routeDescriptor in routesArray) { //根据Route得到扩展描述符 ExtensionDescriptorEntry extensionDescriptor = null; if (routeDescriptor.Route is Route) { object extensionId; var route = routeDescriptor.Route as Route; if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) || route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId)) { extensionDescriptor = _extensionManager.GetExtension(extensionId.ToString()); } } else if (routeDescriptor.Route is IRouteWithArea) { var route = routeDescriptor.Route as IRouteWithArea; extensionDescriptor = _extensionManager.GetExtension(route.Area); } //加载会话状态信息。 var sessionState = SessionStateBehavior.Default; if (extensionDescriptor != null) { if (routeDescriptor.SessionState == SessionStateBehavior.Default) { var descriptor = extensionDescriptor.Descriptor; if (descriptor.Keys.Contains("SessionState")) { Enum.TryParse(descriptor["SessionState"], true, out sessionState); } } } //设置SessionState var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? sessionState : routeDescriptor.SessionState; //创建外壳路由 var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _webWorkContextAccessor, _runningShellTable) { IsHttpRoute = routeDescriptor is HttpRouteDescriptor, SessionState = sessionStateBehavior }; //区域 var area = extensionDescriptor == null ? string.Empty : extensionDescriptor.Id; //尝试查找已存在的集线器路由 var matchedHubRoute = routeList.FirstOrDefault(x => { var hubRoute = x as HubRoute; if (hubRoute == null) { return(false); } return(routeDescriptor.Priority == hubRoute.Priority && hubRoute.Area.Equals(area, StringComparison.OrdinalIgnoreCase) && hubRoute.Name == routeDescriptor.Name); }) as HubRoute; //创建新的集线器路由。 if (matchedHubRoute == null) { matchedHubRoute = new HubRoute(routeDescriptor.Name, area, routeDescriptor.Priority, _runningShellTable); int index; for (index = 0; index < routeList.Count; index++) { var hubRoute = routeList[index] as HubRoute; if (hubRoute == null) { continue; } if (hubRoute.Priority < matchedHubRoute.Priority) { break; } } routeList.Insert(index, matchedHubRoute); } matchedHubRoute.Add(shellRoute, _shellSettings); } //清空现有路由。 _routeCollection.Clear(); foreach (var item in routeList) { if (item is HubRoute) { _routeCollection.Add((item as HubRoute).Name, item); } else { _routeCollection.Add(item); } } } //发布后事件。 _routePublisherEventHandlers.Invoke(i => i.Published(routesArray), NullLogger.Instance); }
public void Publish(IEnumerable <RouteDescriptor> routes) { var routesArray = routes .OrderByDescending(r => r.Priority) .ToArray(); // this is not called often, but is intended to surface problems before // the actual collection is modified var preloading = new RouteCollection(); foreach (var routeDescriptor in routesArray) { // extract the WebApi route implementation var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor; if (httpRouteDescriptor != null) { var httpRouteCollection = new RouteCollection(); httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults); routeDescriptor.Route = httpRouteCollection.First(); } preloading.Add(routeDescriptor.Name, routeDescriptor.Route); } using (routeCollection.GetWriteLock()) { // existing routes are removed while the collection is briefly inaccessable var cropArray = routeCollection .OfType <ShellRoute>() .Where(sr => sr.ShellSettingsName == shellSettings.Name) .ToArray(); foreach (var crop in cropArray) { routeCollection.Remove(crop); } // new routes are added foreach (var routeDescriptor in routesArray) { // Loading session state information. var defaultSessionState = SessionStateBehavior.Default; ExtensionDescriptor extensionDescriptor = null; if (routeDescriptor.Route is Route) { object extensionId; var route = routeDescriptor.Route as Route; if (route.DataTokens != null && route.DataTokens.TryGetValue("area", out extensionId) || route.Defaults != null && route.Defaults.TryGetValue("area", out extensionId)) { extensionDescriptor = extensionManager.GetExtension(extensionId.ToString()); } } else if (routeDescriptor.Route is IRouteWithArea) { var route = routeDescriptor.Route as IRouteWithArea; extensionDescriptor = extensionManager.GetExtension(route.Area); } if (extensionDescriptor != null) { // if session state is not define explicitly, use the one define for the extension if (routeDescriptor.SessionState == SessionStateBehavior.Default) { Enum.TryParse(extensionDescriptor.SessionState, true /*ignoreCase*/, out defaultSessionState); } } // Route-level setting overrides module-level setting (from manifest). var sessionStateBehavior = routeDescriptor.SessionState == SessionStateBehavior.Default ? defaultSessionState : routeDescriptor.SessionState; var shellRoute = new ShellRoute(routeDescriptor.Route, shellSettings, workContextAccessor, runningShellTable) { IsHttpRoute = routeDescriptor is HttpRouteDescriptor, SessionState = sessionStateBehavior }; routeCollection.Add(routeDescriptor.Name, shellRoute); } } }