首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于缓存HttpResponseMessage的DelegatingHandler

用于缓存HttpResponseMessage的DelegatingHandler
EN

Stack Overflow用户
提问于 2016-06-28 21:50:43
回答 2查看 2.1K关注 0票数 2

我正在尝试缓存对webapi端点请求的响应。

我已经创建了一个DelegatingHadler,它使用先前生成的响应重用管道短路,但它不起作用。

我做错了什么?或者,我如何才能正确地完成它?

这是我的DH:

代码语言:javascript
复制
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);
    }

}
EN

回答 2

Stack Overflow用户

发布于 2016-08-24 17:47:40

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

DelegatingHandler的代码可以是found on GitHub

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

票数 2
EN

Stack Overflow用户

发布于 2020-04-25 20:43:55

缓存相同的整个响应对象是不可取的,因为它与请求生命周期捆绑在一起,所以缓存的内容可能比您期望的要多得多。您可以缓存内容和其他一些元数据(statuscode、header等)。在缓存命中时,使用request.GetResponse(...),然后设置所需的内容和值。

从我头顶的台阶上下来

  1. 检查缓存
  2. 如果在缓存中create response from request
  3. 如果不在缓存命中api中,则获取数据、缓存内容和元数据供后续调用使用,确保设置expiree以避免过时的data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38078107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档