Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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])));
        }
Ejemplo n.º 3
0
        /// <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));
        }
Ejemplo n.º 4
0
        /// <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);
        }