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())))); } }
private string CreateUniqueId() { var builder = new StringBuilder(base.UniqueId); DescriptorUtil.AppendUniqueId(builder, MethodInfo); return(builder.ToString()); }
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); } }