public async Task Put(ICacheContext context, CacheEntry newCacheEntry) { var key = await GetKey(context); var isResponseMessage = false; CacheEntry cacheEntry = null; var temp = await _cache.Get <CacheEntry>(key); if (temp != null && context.ResponseValidator(context, temp.Metadata) == ResponseValidationResult.OK) { cacheEntry = temp; } var response = newCacheEntry.Value as HttpResponseMessage; if (cacheEntry == null) { object value; if (response != null) { value = await _serializer.Serialize(response, context.Token); isResponseMessage = true; } else { value = newCacheEntry.Value; } cacheEntry = new CacheEntry(newCacheEntry.Metadata) { Value = value, IsHttpResponseMessage = isResponseMessage }; } else { cacheEntry.Metadata.Merge(newCacheEntry.Metadata); } await Task.WhenAll( _cache.Put(key, cacheEntry), _varyBy.Put(context.Uri, newCacheEntry.Metadata.VaryHeaders), _uriInfo.Put(context.Uri, key) ); }
public async Task <CacheEntry> Get(ICacheContext context) { var key = await GetKey(context); var cacheEntry = await _cache.Get <CacheEntry>(key); if (cacheEntry == null) { return(CacheEntry.Empty); } var validation = context.ResponseValidator(context, cacheEntry.Metadata); if (validation == ResponseValidationResult.Stale && !context.AllowStaleResultValidator(context, cacheEntry.Metadata)) { return(CacheEntry.Empty); } if (validation != ResponseValidationResult.OK && validation != ResponseValidationResult.Stale && validation != ResponseValidationResult.MustRevalidate) { return(CacheEntry.Empty); } object result; if (cacheEntry.IsHttpResponseMessage) { var responseBuffer = cacheEntry.Value as byte[]; result = await _serializer.Deserialize(responseBuffer, context.Token); } else { result = cacheEntry.Value; } return(new CacheEntry(result, cacheEntry.Metadata)); }