コード例 #1
0
        internal string GetChildActionUniqueId(ActionExecutingContext filterContext)
        {
            StringBuilder uniqueIdBuilder = new StringBuilder();

            // Start with a prefix, presuming that we share the cache with other users
            uniqueIdBuilder.Append(CacheKeyPrefix);

            // Unique ID of the action description
            uniqueIdBuilder.Append(filterContext.ActionDescriptor.UniqueId);

            // Unique ID from the VaryByCustom settings, if any
            DescriptorUtil.AppendUniqueId(uniqueIdBuilder, VaryByCustom);
            if (!String.IsNullOrEmpty(VaryByCustom))
            {
                string varyByCustomResult = filterContext.HttpContext.ApplicationInstance.GetVaryByCustomString(HttpContext.Current, VaryByCustom);
                uniqueIdBuilder.Append(varyByCustomResult);
            }

            // Unique ID from the VaryByParam settings, if any
            BuildUniqueIdFromActionParameters(uniqueIdBuilder, filterContext);

            // The key is typically too long to be useful, so we use a cryptographic hash
            // as the actual key (better randomization and key distribution, so small vary
            // values will generate dramtically different keys).
            using (SHA256Cng sha = new SHA256Cng())
            {
                return(Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(uniqueIdBuilder.ToString()))));
            }
        }
コード例 #2
0
        private string CreateUniqueId()
        {
            var builder = new StringBuilder(base.UniqueId);

            DescriptorUtil.AppendUniqueId(builder, MethodInfo);
            return(builder.ToString());
        }
コード例 #3
0
        internal void BuildUniqueIdFromActionParameters(
            StringBuilder builder,
            ActionExecutingContext filterContext
            )
        {
            if (String.Equals(VaryByParam, "none", StringComparison.OrdinalIgnoreCase))
            {
                // nothing to do
                return;
            }

            if (String.Equals(VaryByParam, "*", StringComparison.Ordinal))
            {
                // use all available key/value pairs. Keys need to be sorted so we end up with a stable identifier.
                IEnumerable <KeyValuePair <string, object> > orderedParameters =
                    filterContext.ActionParameters.OrderBy(
                        k => k.Key,
                        StringComparer.OrdinalIgnoreCase
                        );

                foreach (KeyValuePair <string, object> item in orderedParameters)
                {
                    DescriptorUtil.AppendUniqueId(builder, item.Key.ToUpperInvariant());
                    DescriptorUtil.AppendUniqueId(builder, item.Value);
                }

                return;
            }

            LazyInitializer.EnsureInitialized(ref _tokenizedVaryByParams, _splitVaryByParamThunk);

            // By default, filterContext.ActionParameter is a case insensitive (StringComparer.OrdinalIgnoreCase)
            // dictionary. If the user has replaced it with a dictionary that uses a different comparer, we'll
            // wrap it in a Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
            // This allows us to lookup values for action parameters when the VaryByParam token key differs in case.
            Dictionary <string, object> keyValues = GetCaseInsensitiveActionParametersDictionary(
                filterContext.ActionParameters
                );

            for (int i = 0; i < _tokenizedVaryByParams.Length; i++)
            {
                string key = _tokenizedVaryByParams[i];
                DescriptorUtil.AppendUniqueId(builder, key);

                object value;
                keyValues.TryGetValue(key, out value);
                DescriptorUtil.AppendUniqueId(builder, value);
            }
        }