我正在调用一些端点(它们是GRPC)。如果成功,我想缓存响应,并在失败时加载成功响应。我使用自定义 HTTP 客户端来处理这种情况。
这是我的 ChacheHandler:
public class CacheHandler : DelegatingHandler
{
private readonly IRedisCache _cache;
public CacheHandler(IRedisCache cache)
{
_cache = cache;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
response = await base.SendAsync(request, cancellationToken);
if (!response.IsSuccessStatusCode)
{
var options = new JsonSerializerOptions
{
WriteIndented = true
};
var serResponse = System.Text.Json.JsonSerializer.Serialize(response, options);
await _cache.Add(request.RequestUri.ToString(), serResponse);
}
else
{
var byteData = await _cache.Get(request.RequestUri.ToString());
if (byteData != null)
{
var content = Encoding.UTF8.GetString(byteData);
var httpResponseMessage = System.Text.Json.JsonSerializer.Deserialize<HttpResponseMessage>(content);
response = httpResponseMessage;
}
}
return response;
}
}
我无法反序列化我之前缓存的对象。它说该对象应该有无参数构造函数,而这里的 HttpResponseMessage 没有。我尝试了很多方法还是不行。
有什么想法吗?
我认为您无法反序列化
HttpResponseMessage
实例,但您可以做的是使用如下结构存储响应数据:
public sealed class HttpResponseMessageMetadata
{
public int StatusCode { get; set; }
public object Body { get; set; }
}
之后,您可以从缓存中检索此数据,将其反序列化并将其写入新的响应。