我正在尝试缓存对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);
}
}发布于 2016-08-24 17:47:40
Cimpress.Extensions.Http.Caching.InMemory是一个NuGet包,它提供了各种与HTTP相关的实用程序方法,特别是缓存HTTP GET请求结果的HttpMessageHandler。
DelegatingHandler的代码可以是found on GitHub。
要考虑的一点是单独缓存HttpResonseMessage.Content结果,因为流,特别是网络流,意味着只读取一次。
发布于 2020-04-25 20:43:55
缓存相同的整个响应对象是不可取的,因为它与请求生命周期捆绑在一起,所以缓存的内容可能比您期望的要多得多。您可以缓存内容和其他一些元数据(statuscode、header等)。在缓存命中时,使用request.GetResponse(...),然后设置所需的内容和值。
从我头顶的台阶上下来
https://stackoverflow.com/questions/38078107
复制相似问题