0

Я только что реализовал выходное кэширование своих контроллеров веб-API Asp.Net, используя StrathWeb's library, подключившись к StackExchange.Redis library, подключившись к кэшу Redis-кэша, содержащему Azure.Атрибут CacheOutput Игнорирование кэша Redis с использованием Azure

Я написал специальный класс, который реализует StrathWeb IApiOutputCache interface и вызывает эквивалентные методы StackExchange. Это зарегистрировано в качестве выходного файла кэша в Global.asax.cs.

Вот пример использования:

public class MyApiController : ApiController 
{ 
    private const int FIFTEEN_MINUTES_IN_SECONDS = 900; 

    [CacheOutput(ClientTimeSpan = FIFTEEN_MINUTES_IN_SECONDS, ServerTimeSpan = FIFTEEN_MINUTES_IN_SECONDS)] 
    async public Task<Data> GetAsync(int param1, string param2) 
    { 
    return await GetExpensiveData(); 
    } 

    [Serializable] 
    public class Data 
    { 
    // Members omitted for brevity 
    } 
} 

Когда вызов сделан к апи конечной точке я могу видеть, что структура правильно называет все необходимые методы в моем классе IApiOutputCache: Содержит, Set и Get. Однако даже при обнаружении и возврате кешированной копии метод GetExpensiveData() всегда запускается и возвращаются «свежие» данные.

Ошибок не возникает. Кажется, что кеш работает. Тем не менее, мой дорогой код всегда называется.

Спасибо за помощь :).

+3

Вы можете поделиться своей реализацией IApiOutputCache Redis? – tuler

ответ

1

Проблема решена. Я неправильно звонил в Redis из своего класса IApiOutputCache.

Перед ...

public class AzureRedisApiOutputCache : IApiOutputCache 
{ 
    public object Get(string key) 
    { 
    return AzureRedisCache.Instance.GetDatabase().StringGet(key); 
    } 
} 

После ...

public class AzureRedisApiOutputCache : IApiOutputCache 
{ 
    public object Get(string key) 
    { 
    // Call the extension method that also performs deserialization... 
    return AzureRedisCache.Instance.GetDatabase().Get(key); 
    } 
} 

public static class RedisDatabaseExtensions 
{ 
    public static object Get(this IDatabase cache, string key) 
    { 
     return Deserialize<object>(cache.StringGet(key)); 
    } 
} 

Это смутило меня в течение некоторого времени в качестве основы CacheOutput никогда не сообщил об ошибке. Он просто молчал и вернулся к методу контроллера.

 Смежные вопросы

  • Нет связанных вопросов^_^