【问题标题】:DelegatingHandler to cache an HttpResponseMessageDelegatingHandler 缓存一个 HttpResponseMessage
【发布时间】:2016-06-28 13:50:43
【问题描述】:

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

}

【问题讨论】:

  • 缓存响应标头?
  • 整个响应,一切
  • 是的,但是您必须在缓存整个 ResponseMessage 之前添加缓存响应标头!
  • 浏览器可以缓存请求,如果你在响应中设置了相应的缓存头,但你只想在服务器上缓存请求处理吗?目前您只缓存请求处理,这意味着您的缓存中已经有一个构建响应。但是,当使用这种方法时,浏览器仍然会发出请求。问题是,你想发生什么?
  • 对不起,我想先把它缓存在服务器端,缓存头不是我主要关心的。我想从金属中获得全部力量:D

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


【解决方案1】:

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

DelegatingHandler 的代码可以是found on GitHub

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

【讨论】:

    【解决方案2】:

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

    我的头顶台阶

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      相关资源
      最近更新 更多