缓存成功响应并在失败后加载

问题描述 投票:0回答:1

我正在调用一些端点(它们是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 没有。我尝试了很多方法还是不行。

有什么想法吗?

c# grpc responsecache
1个回答
0
投票

我认为您无法反序列化

HttpResponseMessage
实例,但您可以做的是使用如下结构存储响应数据:

public sealed class HttpResponseMessageMetadata
{
    public int StatusCode { get; set; }

    public object Body { get; set; }
}

之后,您可以从缓存中检索此数据,将其反序列化并将其写入新的响应。

© www.soinside.com 2019 - 2024. All rights reserved.