/// <summary> /// 添加一个路由规则 /// </summary> /// <param name="rule">路由规则</param> protected void AddRule(SimpleRoutingRule rule) { { var conflictRule = _rules .Where(r => r.RouteKeys.Length == rule.RouteKeys.Length) //若通过RouteKey多寡无法区分 .Where(r => r.DynamicRouteKyes.Length == rule.DynamicRouteKyes.Length) //若通过动态路径段多寡也无法区分 .Where(r => !SimpleRoutingRule.Mutex(r, rule)) //若与现存规则不互斥 .FirstOrDefault(); if (conflictRule != null) { throw new InvalidOperationException(string.Format("添加规则\"{0}\"失败,路由表中已经存在一条可能冲突的规则:\"{1}\"", rule.Name, conflictRule.Name)); } } { var conflictRule = _rules .Where(r => r.Paragraphes.Length == rule.Paragraphes.Length) //若路径段长度一致 .Where(r => r.StaticPrefix.EqualsIgnoreCase(rule.StaticPrefix)) //若静态段也一致 .FirstOrDefault(); if (conflictRule != null) { throw new InvalidOperationException(string.Format("添加规则\"{0}\"失败,路由表中已经存在一条可能冲突的规则:\"{1}\"", rule.Name, conflictRule.Name)); } } _rules.Add(rule); }
/// <summary> /// 检查两个路由规则是否互斥。 /// </summary> /// <param name="rule1">路由规则1</param> /// <param name="rule2">路由规则2</param> /// <returns></returns> public static bool Mutex(SimpleRoutingRule rule1, SimpleRoutingRule rule2) { var KeySet = new HashSet <string>(rule1.StaticRouteValues.Keys, StringComparer.OrdinalIgnoreCase); var KeySet2 = new HashSet <string>(rule2.StaticRouteValues.Keys, StringComparer.OrdinalIgnoreCase); KeySet.IntersectWith(KeySet2); return(KeySet.Any(key => !rule1.StaticRouteValues[key].EqualsIgnoreCase(rule2.StaticRouteValues[key]))); }
/// <summary> /// 比较两个路由规则约束是否一致 /// </summary> /// <param name="rule">要比较的路由规则</param> /// <returns>两个规则的约束是否一致</returns> public bool EqualsConstraints(SimpleRoutingRule rule) { if (rule == null) { throw new ArgumentNullException("rule"); } if (rule.StaticRouteValues.Count != StaticRouteValues.Count) { return(false); } return(IsMatch(rule.StaticRouteValues)); }
/// <summary> /// 添加一个路由规则 /// </summary> /// <param name="name"></param> /// <param name="urlPattern"></param> /// <param name="routeValues"></param> /// <param name="queryKeys"></param> /// <param name="limitedQueries"></param> public void AddRule(string name, string urlPattern, IDictionary <string, string> routeValues, string[] queryKeys, bool limitedQueries) { if (urlPattern == null) { throw new ArgumentNullException("urlPattern"); } if (routeValues == null) { throw new ArgumentNullException("routeValues"); } var rule = new SimpleRoutingRule(this, name, urlPattern, routeValues, queryKeys ?? new string[0], limitedQueries); AddRule(rule); }