コード例 #1
0
        /// <summary>
        /// 检查指定规则是否与简单路由表现存的任何规则冲突,若有冲突,返回与其冲突的规则。
        /// </summary>
        /// <param name="rule">要检查冲突的规则</param>
        /// <returns>如果现存规则与检查的规则存在一个冲突,则返回冲突的规则。</returns>
        public SimpleRouteRule CheckConflict(SimpleRouteRule rule)
        {
            //验证 GetVirtualPath 时可能的冲突
            {
                var conflictRule = _rules
                                   .Where(r => r.RouteKeys.Length == rule.RouteKeys.Length)               //若通过RouteKey多寡无法区分
                                   .Where(r => r.DynamicRouteKyes.Length == rule.DynamicRouteKyes.Length) //若通过动态路径段多寡也无法区分
                                   .Where(r => !SimpleRouteRule.Mutex(r, rule))                           //若与现存规则不互斥
                                   .FirstOrDefault();

                if (conflictRule != null)
                {
                    return(conflictRule);
                }
            }

            //验证 GetRouteData 时可能的冲突
            {
                var conflictRule = _rules
                                   .Where(r => r.Paragraphes.Length == rule.Paragraphes.Length)    //若路径段长度一致
                                   .Where(r => r.StaticPrefix.EqualsIgnoreCase(rule.StaticPrefix)) //若静态段也一致
                                   .FirstOrDefault();


                if (conflictRule != null)
                {
                    return(conflictRule);
                }
            }

            return(null);
        }
コード例 #2
0
        /// <summary>
        /// 添加一个路由规则
        /// </summary>
        /// <param name="rule">路由规则</param>
        protected virtual SimpleRouteRule AddRule(SimpleRouteRule rule)
        {
            lock ( Routes )
            {
                if (Routes != null && !Routes.Contains(this))
                {
                    Routes = null;
                }

                if (Routes == null)
                {
                    throw new InvalidOperationException("简单路由表实例并未被正确的注册在一个路由集合中,无法检测与路由集合中其他简单路由表是否存在冲突,所以不能添加简单路由规则");
                }

                var conflictRule = Routes.CheckConflict(rule);

                if (conflictRule != null)
                {
                    throw new InvalidOperationException(string.Format("添加规则\"{0}\"失败,路由表 \"{1}\" 中已经存在一条可能冲突的规则:\"{2}\"", rule.Name, conflictRule.SimpleRouteTable.Name, conflictRule.Name));
                }
            }


            _rules.Add(rule);

            rule.SimpleRouteTable = this;

            return(rule);
        }
コード例 #3
0
        /// <summary>
        /// 检查两个路由规则是否互斥。
        /// </summary>
        /// <param name="rule1">路由规则1</param>
        /// <param name="rule2">路由规则2</param>
        /// <returns></returns>
        public static bool Mutex(SimpleRouteRule rule1, SimpleRouteRule 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])));
        }
コード例 #4
0
        /// <summary>
        /// 比较两个路由规则约束是否一致
        /// </summary>
        /// <param name="rule">要比较的路由规则</param>
        /// <returns>两个规则的约束是否一致</returns>
        public bool EqualsConstraints(SimpleRouteRule rule)
        {
            if (rule == null)
            {
                throw new ArgumentNullException("rule");
            }


            if (rule.StaticRouteValues.Count != StaticRouteValues.Count)
            {
                return(false);
            }

            return(IsMatch(rule.StaticRouteValues));
        }
コード例 #5
0
        /// <summary>
        /// 添加一个路由规则
        /// </summary>
        /// <param name="name">规则名称</param>
        /// <param name="urlPattern">URL 模式</param>
        /// <param name="routeValues">静态/默认路由值</param>
        /// <param name="queryKeys">可用于 QueryString 的参数,若为null则表示无限制</param>
        public virtual SimpleRouteRule AddRule(string name, string urlPattern, IDictionary <string, string> routeValues, string[] queryKeys)
        {
            if (urlPattern == null)
            {
                throw new ArgumentNullException("urlPattern");
            }

            if (routeValues == null)
            {
                throw new ArgumentNullException("routeValues");
            }

            var rule = new SimpleRouteRule(name, urlPattern, routeValues, queryKeys);

            return(AddRule(rule));
        }
コード例 #6
0
        /// <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());
            }
        }