/// <summary>
        /// This method must be used inside CacheKeyGenerator
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public virtual string GetRoutePattern(HttpRequestMessage request)
        {
            var routeData = request.GetRouteData();
            if (routeData == null)
                routeData = _configuration.Routes.GetRouteData(request);

            if(routeData == null)
                return GetDefaultRoutePattern(request);

            var routeInfo = new RouteInfo(routeData.Route);

            // deal with no parameters
            if (routeInfo.Parameters.Count == 0)
                    return GetDefaultRoutePattern(request);


            // deal with catchall
            if (routeInfo.Parameters.Any(x => x.IsCatchAll))
                return GetDefaultRoutePattern(request);
         
            if (routeInfo.IsCollection(routeData))
            {
                return routeInfo.BuildCollectionPattern( routeData);
            }
            else
            {
                return routeInfo.BuildInstancePattern(request.RequestUri, routeData);                
            }
        }
        /// <summary>
        /// This method must be set to LinkedRoutePatternProvider of CachingHandler
        /// </summary>
        /// <param name="message"></param>
        /// <returns>All linked route patterns</returns>
        public virtual IEnumerable<string> GetLinkedRoutePatterns(HttpRequestMessage request)
        {
            var routeData = request.GetRouteData();
            if (routeData == null)
                return new string[0];

            var routeInfo = new RouteInfo(routeData.Route);

            // deal with no parameters
            if (routeInfo.Parameters.Count == 0)
                return new string[0];

            // deal with catchall
            if (routeInfo.Parameters.Any(x => x.IsCatchAll))
                return new string[0];

            var linkedRoutePatterns = new List<string>();
            linkedRoutePatterns.Add(routeInfo.GetRoot(routeData));

            if (!routeInfo.IsCollection(routeData))
            {
                linkedRoutePatterns.Add(routeInfo.BuildCollectionPattern(routeData));
            }

            return linkedRoutePatterns;

        }
        /// <summary>
        /// This method must be used inside CacheKeyGenerator
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public virtual string GetRoutePattern(HttpRequestMessage request)
        {
            var routeData = request.GetRouteData();

            if (routeData == null)
            {
                routeData = _configuration.Routes.GetRouteData(request);
            }

            if (routeData == null)
            {
                return(GetDefaultRoutePattern(request));
            }

            var routeInfo = new RouteInfo(routeData.Route);

            // deal with no parameters
            if (routeInfo.Parameters.Count == 0)
            {
                return(GetDefaultRoutePattern(request));
            }


            // deal with catchall
            if (routeInfo.Parameters.Any(x => x.IsCatchAll))
            {
                return(GetDefaultRoutePattern(request));
            }

            if (routeInfo.IsCollection(routeData))
            {
                return(routeInfo.BuildCollectionPattern(routeData));
            }
            else
            {
                return(routeInfo.BuildInstancePattern(request.RequestUri, routeData));
            }
        }