2

我正在尝试缓存对 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);
    }

}
4

2 回答 2

2

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

的代码DelegatingHandler可以在 GitHub 上找到

要考虑的一点是HttpResonseMessage.Content单独缓存结果,因为流,尤其是网络流,意味着只能读取一次。

于 2016-08-24T09:47:40.157 回答
0

缓存相同的整个响应对象是不可取的,因为它与请求生命周期相关,因此您缓存的内容会超出您的预期。您可以缓存内容和其他一些元数据(状态码、标题等)。在缓存命中使用request.GetResponse(...)然后设置您需要的内容和值。

离开我的头顶台阶

  1. 检查缓存
  2. 如果在缓存中创建请求响应
  3. 如果不在缓存命中 api 中,获取数据、缓存内容和元数据以供后续调用确保设置 expiree 以避免过时数据
于 2020-04-25T12:43:55.310 回答