/// <summary>
        /// 注册路由
        /// </summary>
        /// <param name="methodInfo"></param>
        /// <param name="servicePath"></param>
        public void RegisterRestPaths(MethodInfo methodInfo, string servicePath)
        {
            //获取到RouteAttribute
            List <RouteAttribute> attrs = methodInfo.GetCustomAttributes(typeof(RouteAttribute), false).OfType <RouteAttribute>().ToList();
            //默认的路由前面要加上 "/"
            string defaultOperationRestPath = ("/" + methodInfo.Name).ToLower();

            //如果没有打RouteAttribute 加入一个默认的路由
            if (attrs.Count(a => a.Path.ToLower() == defaultOperationRestPath) == 0)
            {
                attrs.Add(new RouteAttribute(defaultOperationRestPath));
            }

            foreach (RouteAttribute attr in attrs)
            {
                var restPath = new RestPath(methodInfo, attr.Path, attr.Verbs, attr.Summary, attr.Notes);

                var defaultAttr = attr as FallbackRouteAttribute;
                if (defaultAttr != null)
                {
                    if (EndpointHost.Config != null)
                    {
                        if (EndpointHost.Config.FallbackRestPaths.ContainsKey(servicePath))
                        {
                            throw new NotSupportedException(string.Format(
                                                                "FallbackRouteAttribute is already defined. Only 1 [FallbackRoute] is allowed."));
                        }

                        EndpointHost.Config.FallbackRestPaths[servicePath] = (httpMethod, theServicePath, pathInfo, filePath) =>
                        {
                            var pathInfoParts = RestPath.GetPathPartsForMatching(pathInfo);
                            return(restPath.IsMatch(httpMethod, pathInfoParts) ? restPath : null);
                        };
                    }

                    continue;
                }

                if (!restPath.IsValid)
                {
                    throw new NotSupportedException(string.Format(
                                                        "RestPath '{0}' on method '{1}' is not Valid", attr.Path, methodInfo.Name));
                }
                //路由注册
                RegisterRestPath(restPath, servicePath);
            }
        }
        public IRestPath GetRestPathForRequest(string httpMethod, string servicePath, string pathInfo)
        {
            Dictionary <string, List <RestPath> > restPaths = RestPathMap[servicePath];

            var matchUsingPathParts = RestPath.GetPathPartsForMatching(pathInfo);

            List <RestPath> firstMatches;

            var yieldedHashMatches = RestPath.GetFirstMatchHashKeys(matchUsingPathParts);

            foreach (var potentialHashMatch in yieldedHashMatches)
            {
                if (!restPaths.TryGetValue(potentialHashMatch, out firstMatches))
                {
                    continue;
                }

                var bestScore = -1;
                foreach (var restPath in firstMatches)
                {
                    var score = restPath.MatchScore(httpMethod, matchUsingPathParts);
                    if (score > bestScore)
                    {
                        bestScore = score;
                    }
                }
                if (bestScore > 0)
                {
                    foreach (var restPath in firstMatches)
                    {
                        if (bestScore == restPath.MatchScore(httpMethod, matchUsingPathParts))
                        {
                            return(restPath);
                        }
                    }
                }
            }

            var yieldedWildcardMatches = RestPath.GetFirstMatchWildCardHashKeys(matchUsingPathParts);

            foreach (var potentialHashMatch in yieldedWildcardMatches)
            {
                if (!restPaths.TryGetValue(potentialHashMatch, out firstMatches))
                {
                    continue;
                }

                var bestScore = -1;
                foreach (var restPath in firstMatches)
                {
                    var score = restPath.MatchScore(httpMethod, matchUsingPathParts);
                    if (score > bestScore)
                    {
                        bestScore = score;
                    }
                }
                if (bestScore > 0)
                {
                    foreach (var restPath in firstMatches)
                    {
                        if (bestScore == restPath.MatchScore(httpMethod, matchUsingPathParts))
                        {
                            return(restPath);
                        }
                    }
                }
            }

            return(null);
        }