public void returns_all_keys_in_cache() { IApiOutputCache cache = new MemoryCacheDefault(); cache.Add("base", "abc", DateTime.Now.AddSeconds(60)); cache.Add("key1", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key2", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key3", "abc", DateTime.Now.AddSeconds(60), "base"); var result = cache.AllKeys; CollectionAssert.AreEquivalent(new[] { "base", "key1", "key2", "key3" }, result); }
public void returns_all_keys_in_cache() { IApiOutputCache cache = new MemoryCacheDefault(); cache.Add("base", "abc", DateTime.Now.AddSeconds(60)); cache.Add("key1", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key2", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key3", "abc", DateTime.Now.AddSeconds(60), "base"); var result = cache.AllKeys; CollectionAssert.AreEquivalent(new[] { "base", "key1", "key2", "key3" }, result); }
public void remove_startswith_cascades_to_all_dependencies() { IApiOutputCache cache = new MemoryCacheDefault(); cache.Add("base", "abc", DateTime.Now.AddSeconds(60)); cache.Add("key1","abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key2", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key3", "abc", DateTime.Now.AddSeconds(60), "base"); Assert.IsNotNull(cache.Get("key1")); Assert.IsNotNull(cache.Get("key2")); Assert.IsNotNull(cache.Get("key3")); cache.RemoveStartsWith("base"); Assert.IsNull(cache.Get("base")); Assert.IsNull(cache.Get("key1")); Assert.IsNull(cache.Get("key2")); Assert.IsNull(cache.Get("key3")); }
public void remove_startswith_cascades_to_all_dependencies() { IApiOutputCache cache = new MemoryCacheDefault(); cache.Add("base", "abc", DateTime.Now.AddSeconds(60)); cache.Add("key1", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key2", "abc", DateTime.Now.AddSeconds(60), "base"); cache.Add("key3", "abc", DateTime.Now.AddSeconds(60), "base"); Assert.IsNotNull(cache.Get("key1")); Assert.IsNotNull(cache.Get("key2")); Assert.IsNotNull(cache.Get("key3")); cache.RemoveStartsWith("base"); Assert.IsNull(cache.Get("base")); Assert.IsNull(cache.Get("key1")); Assert.IsNull(cache.Get("key2")); Assert.IsNull(cache.Get("key3")); }
/// <summary> /// 将输出保存在缓存中。 /// </summary> /// <param name="actionExecutedContext"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override async System.Threading.Tasks.Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, System.Threading.CancellationToken cancellationToken) { // 响应对象已经生成,可以直接调用 actionExecutedContext.Response // 设置协商缓存:etag EntityTagHeaderValue etag = new EntityTagHeaderValue("\"" + Guid.NewGuid().ToString() + "\""); // 根据http协议, ETag的值必须用引号包含起来 actionExecutedContext.Response.Headers.ETag = etag; // 设置user agent的本地缓存 actionExecutedContext.Response.Headers.CacheControl = GetDefaultCacheControl(); // actionExecutedContext.Response.Headers.Remove("Content-Length"); // 改变了值,它会发生变化。删除它的话,后续的程序会自动地再计算 // 保存到缓存 string cacheKey = getCacheKey(actionExecutedContext.ActionContext); var contentBytes = await actionExecutedContext.Response.Content.ReadAsByteArrayAsync(); _cache.Add(cacheKey + ":etag", etag.Tag, DateTimeOffset.Now.AddSeconds(this.ServerCacheExpiration)); _cache.Add(cacheKey, contentBytes, DateTimeOffset.Now.AddSeconds(this.ServerCacheExpiration)); }