es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando recibes una respuesta de la caché de Redis, capitaliza la respuesta.

Tengo un problema en el que almaceno en caché una respuesta de mi API. Primero, mi entidad no está en mayúsculas, pero cuando se almacena en caché desde el servidor Redis, mi entidad se convierte automáticamente en mayúsculas. ¿Cómo puedo solucionar eso?

Aquí está la imagen:

Respuesta la primera vez

La siguiente vez con caché del servidor Redis

Aquí está mi código para almacenar en caché la respuesta:

 public async Task CacheResponseAsync(string key, object response, TimeSpan timeToLive)
{
    if (response == null)
    {
        return;
    }

    var serializedResponse = JsonConvert.SerializeObject(response);

    await _distributedCache.SetStringAsync(key, serializedResponse, new DistributedCacheEntryOptions
    {
        AbsoluteExpirationRelativeToNow = timeToLive
    });
}

“`csharp
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var cacheSetting = context.HttpContext.RequestServices.GetRequiredService<rediscachesetting>();

<pre><code>if (!cacheSetting.Enabled)
{
await next();
return;
}

var cacheService = context.HttpContext.RequestServices.GetRequiredService<iresponsecacheservice>();
var cacheKey = GenerateKeyFromRequest(context.HttpContext.Request);

var cacheResponse = await cacheService.GetCacheResponseAsync(cacheKey);

if (!string.IsNullOrEmpty(cacheResponse))
{
var rs = new ContentResult
{
Content = cacheResponse,
ContentType = "application/json",
StatusCode = 200,
};

context.Result = rs;

return;
}

var executedContext = await next();

if (executedContext.Result is ObjectResult okObjectResult)
{
await cacheService.CacheResponseAsync(cacheKey, okObjectResult.Value, TimeSpan.FromSeconds(_timeToLiveSeconds));
}
</code></pre>

}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema que estás enfrentando no es con Redis, sino con el proceso de serialización/deserialización del objeto que se está almacenando en caché.

    Para solucionar el problema de la auto-capitalización, puedes modificar el método JsonConvert.SerializeObject para incluir un objeto custom de JsonSerializerSettings con la propiedad StringEnumConverter establecida en CamelCaseNamingStrategy. Esto garantizará que el objeto de respuesta se serialice con la capitalización correcta.

    Aquí tienes una versión actualizada de tu método CacheResponseAsync:

    public async Task CacheResponseAsync(string key, object response, TimeSpan timeToLive)
    {
        if (response == null)
        {
            return;
        }
    
        var serializedResponse = JsonConvert.SerializeObject(response, new JsonSerializerSettings {
            ContractResolver = new DefaultContractResolver {
                NamingStrategy = new CamelCaseNamingStrategy()
            },
            Converters = { new StringEnumConverter(new CamelCaseNamingStrategy()) }
        });
    
        await _distributedCache.SetStringAsync(key, serializedResponse, new DistributedCacheEntryOptions
        {
            AbsoluteExpirationRelativeToNow = timeToLive
        });
    }
    

    Esto asegurará que el objeto de respuesta almacenado en caché se deserialice correctamente sin cambios inesperados de capitalización.

Comments are closed.