Beispiel #1
0
        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)
                );
        }
Beispiel #2
0
        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));
        }