2016-06-28 45 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結果,因爲流(尤其是網絡流)只能讀取一次。