我试图缓存对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);
}
}
答案 0 :(得分:2)
Cimpress.Extensions.Http.Caching.InMemory是一个NuGet包,提供各种HTTP相关的实用程序方法,特别是缓存HTTP GET请求结果的HttpMessageHandler
。
DelegatingHandler
的代码可以是found on GitHub。
需要考虑的一点是分别缓存HttpResonseMessage.Content
结果,因为流(尤其是网络流)只能读取一次。
答案 1 :(得分:0)
建议不要缓存相同的整个响应对象,因为它与请求生命周期相关联,因此缓存的内容要比讨价还价的要多得多。您可以缓存内容和其他一些元数据(状态码,标头等)。命中高速缓存时,请使用request.GetResponse(...)
,然后设置所需的内容和值。
迈开我的第一步