Кэширование с использованием MemoryCache не работает в ASP.NET WEBI Delegating Handler

У меня есть требование читать практически статический файл JSON при каждом запросе. Я использую веб-API ASP.NET 2, ориентированный на .NET 4.5. Я намеревался использовать для этого кеш System.Runtime.Caching.Memory. Я использую это кеширование в обработчике сообщений делегирования. К моему удивлению, кеш совсем не работает. Каждый раз, когда приходит запрос, похоже, что ключ кеша не существует, и он просто продолжает кодировать файл. Чтобы проверить то же самое, я использовал IIS Express 8.0 и точку останова в VS 2012.

Мой код такой, как показано ниже

public class AuthenticationHandler:DelegatingHandler
{

    ObjectCache currentCache = MemoryCache.Default;

    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        if (!request.Headers.Contains("source"))
            request.Headers.Add("source", "1");
        var exclusionList = GetFromCache();
        if (exclusionList.Exists(item => request.RequestUri.OriginalString.ToLower().Contains(item.ToLower())))
        {
            return base.SendAsync(request, cancellationToken);
        }
        else if (request.Headers.Contains("id"))
        {
            return base.SendAsync(request, cancellationToken);
        }
        else
        {
            TaskCompletionSource<HttpResponseMessage> responseMessageTask = new TaskCompletionSource<HttpResponseMessage>();

            HttpResponseMessage response = request.CreateErrorResponse(System.Net.HttpStatusCode.BadRequest, "Session id not present in the header");
            responseMessageTask.SetResult(response);
            return responseMessageTask.Task;
        }

    }
    private List<string> GetFromCache()
    {
        //ObjectCache currentCache = MemoryCache.Default;
        //var currentCache = HttpContext.Current.Cache;
        CacheItemPolicy expirationPolicy = new CacheItemPolicy();
        var exclusionList = currentCache.Get("__ExclusionList") as List<string>;
        if (exclusionList == null)
        {

            string filePath = HostingEnvironment.MapPath("~/config/Exclusion.config");
            string jsonConfig = File.ReadAllText(filePath);
            exclusionList = JsonConvert.DeserializeObject<List<string>>(jsonConfig);
            CacheItem item = new CacheItem("__ExclusionList");
            item.Value = exclusionList;

            expirationPolicy.ChangeMonitors.Add(new HostFileChangeMonitor(new List<string>() { filePath }));


        }
        return exclusionList;
    }
}

В функции GetFromCache, когда я помещаю точку останова в сегмент if, я вижу, что содержимое всегда загружается из файла, а не из кеша в любом случае. Подскажите, пожалуйста, если я что-то упускаю?


person Venkatesh    schedule 03.01.2014    source источник
comment
Немного загадочно, но следили ли вы за этим в документации? Поскольку экземпляр кэша по умолчанию не создается конструктором, необходимо использовать конфигурацию, чтобы явно задать значения памяти и опроса для экземпляра кэша по умолчанию. Для получения дополнительной информации см. Элемент ‹memoryCache› (Настройки кэша).   -  person spender    schedule 03.01.2014
comment
Вы нашли свою проблему? У меня есть такой же :(   -  person Pouya Samie    schedule 06.01.2015