DelegatingHandler缓存HttpResponseMessage

时间:2016-06-28 13:50:43

标签: c# asp.net .net asp.net-web-api2 delegatinghandler

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

我创建了一个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);
    }

}

2 个答案:

答案 0 :(得分:2)

Cimpress.Extensions.Http.Caching.InMemory是一个NuGet包,提供各种HTTP相关的实用程序方法,特别是缓存HTTP GET请求结果的HttpMessageHandler

DelegatingHandler的代码可以是found on GitHub

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

答案 1 :(得分:0)

建议不要缓存相同的整个响应对象,因为它与请求生命周期相关联,因此缓存的内容要比讨价还价的要多得多。您可以缓存内容和其他一些元数据(状态码,标头等)。命中高速缓存时,请使用request.GetResponse(...),然后设置所需的内容和值。

迈开我的第一步

  1. 检查缓存
  2. 如果在缓存中,则根据请求创建响应
  3. 如果不在缓存命中api中,请为后续调用获取数据,缓存内容和元数据,以确保设置过期时间以避免过期数据