2016-06-28 46 views
1

我试图缓存对webapi端点请求的响应。DelegatingHandler缓存HttpResponseMessage

我已经创建了一个DelegatingHadler,它将流水线重复使用先前生成的响应进行短路,但它不起作用。

我在做什么错?或者我如何正确地做到这一点?

这是我的DH:

public class StuffCache : DelegatingHandler 
{ 
    public const string URL_CACHED = @"/stuff-endpoint/items"; 

    ObjectCache cache = MemoryCache.Default; 

    public StuffCache() 
    { 
     cache = MemoryCache.Default; 
    } 

    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 

     if (request.Method == HttpMethod.Get) 
     { 
      if (request.RequestUri.AbsolutePath.ToLower() == URL_CACHED) 
      { 
       HttpResponseMessage response = (HttpResponseMessage)cache["CachedItemName"]; 

       if (response == null) 
       { 
        response = await base.SendAsync(request, cancellationToken); 
        cache.Add("CachedItemName", response, null); 
       } 

       return response; 
      } 
     } 

     return await base.SendAsync(request, cancellationToken); 
    } 

} 
+0

缓存响应头? – Legends

+0

整个响应,所有内容 –

+0

是的,但您必须在缓存整个ResponseMessage之前添加缓存响应标题! – Legends

回答

1

Cimpress.Extensions.Http.Caching.InMemory是NuGet包,提供各种HTTP相关的实用方法,尤其是缓存HTTP GET请求的结果的HttpMessageHandler

DelegatingHandler的代码可以是found on GitHub

要考虑的一点是分开缓存HttpResonseMessage.Content结果,因为流(尤其是网络流)只能读取一次。