IMemoryCache, похоже, не работает на сервере для основного веб-приложения ASP.Net, размещенного в IIS 7 - PullRequest
0 голосов
/ 20 октября 2019

Я разработал приложение Asp.Net Core с использованием .Net Core 2.1 и Visual Studio 2017. Запуск этого на IIS 7.

Если я запускаю это приложение локально, кажется, что MemoryCache продолжает удерживатьрассматриваемая пара ключ-значение после первого набора пары ключ / значение. На сервере кажется, что он никогда не сохраняет пару ключ / значение. Я использую Dependency Injection в своих контроллерах, и у меня есть базовый контроллер, который унаследован от всех других контроллеров. В этом базовом контроллере есть метод GET, который вызывает в базе данных около 40000 строк данных, которые преобразуются в JSONResult, который я затем помещаю в MemoryCache. При последующих вызовах этого GET-запроса он должен возвращать JSONResult, хранящийся в MemoryCache, по крайней мере, так происходит локальная отладка.

Кэш памяти добавляется в ConfigureServices с помощью этой строки services.AddMemoryCache(); Затем вбазовый контроллер Я установил длительный запрос к базе данных в JsonResult и сохранил его в кеше памяти следующим образом:

            JsonResult geos = null;
            if(!_cache.TryGetValue<JsonResult>("GeoLocations", out geos))
            {
                JsonResult newGeos = Json(await _wlDal.GetLocationInfo());
                // Set cache options.
                var cacheEntryOptions = new MemoryCacheEntryOptions()
                   .SetAbsoluteExpiration(new DateTime(9999, 12, 31));
                // Save data in cache.
                _cache.Set("GeoLocations", newGeos, cacheEntryOptions);
            }


            return _cache.Get("GeoLocations") as JsonResult;

Насколько я понимаю, строка services.AddMemoryCache() должна создавать экземпляр синглтона, который может использоваться в приложении. и вводится в контроллеры. Есть что-то, чего я здесь не хватает? Первый вызов этого метода GET обычно занимает около 13 секунд из-за 40000 строк данных, возвращаемых из SQL. В этом и заключается смысл кэширования этих данных для использования несколькими сеансами / пользователями. У кого-нибудь есть идеи относительно того, почему кажется, что эта пара ключ / значение не сохраняется на веб-сервере?

1 Ответ

0 голосов
/ 20 октября 2019

Возможно, ваш сервер отключит ваше приложение после нескольких минут бездействия. Следовательно, он очищает кэшированные данные. Вы должны проверить свои конфигурации IIS. Кроме того, вы используете кэш памяти для неправильной цели. Вы не должны полагаться на кэш памяти для этого сценария. Может быть, вы можете использовать кэш Redis. Наконец, для этого вы можете использовать кеширование ответов в ядре asp.net, которое проще и более подходит для того, что вы хотите.

...