Попытка глобально кэшировать данные в C # WebService, но возникают проблемы - PullRequest
0 голосов
/ 26 сентября 2011

Я работаю с API, который работает довольно медленно, и в результате мое приложение получает довольно большой удар по производительности. Мне удалось оптимизировать часть кода и значительно сократить время загрузки, но я также хотел бы кэшировать некоторые данные во всех сеансах, чтобы минимизировать количество обращений к серверу, которое я должен совершить. Сейчас я выполняю один вызов API, который занимает почти 10 секунд, и возвращаемые данные редко изменяются (возможно, раз в несколько недель). То, что я хотел бы сделать, это кэшировать этот результат, а также время, когда он был получен, и выполнять вызов API только в том случае, если с момента последнего вызова прошло определенное время, в противном случае возвращаются кэшированные результаты. В настоящее время я пытаюсь это:

[WebMethod]
    public List<RegionList> getRegionLists() {
        if (GlobalAppCache.RegionListsLastUpdate == DateTime.MinValue || GlobalAppCache.RegionListsLastUpdate.AddMinutes(15) > DateTime.Now)
        {
            List<RegionList> regionLists = new List<RegionList>( );
            // Do Some API Calls
            GlobalAppCache.RegionListsLastUpdate = DateTime.Now;
            GlobalAppCache.CachedRegionLists = regionLists;
            return regionLists;
        }
        return GlobalAppCache.CachedRegionLists;
    }

С классом GlobalAppCache:

public class GlobalAppCache {
    public static DateTime RegionListsLastUpdate{get;set;}
    public static List<RegionList> CachedRegionLists{get;set;}
}

Этот метод кэширования не работает (вызов API выполняется каждый раз, и результаты из кэша не возвращаются), и я не смог получить ничего общего с приложением [] массив для работы либо. Кто-нибудь может указать мне правильное направление? Если я смогу заставить это работать, я смогу улучшить производительность, кэшируя больше элементов в этом объекте GlobalAppCache. Спасибо!

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Попробуйте записать в приложение HttpApplicationState объект.При получении данных вы должны обратить внимание на приведение к правильному типу данных:

Application ["LastUpdate"] = DateTime.Now;

.. .. ..

object o = Application["LastUpdate"];
if (o != null) DateTime dLastUpdate = Convert.ToDateTime(o);

... ...

Объект приложения умирает, когда перезапускается / перезапускается AppPool, в котором работает веб-служба

0 голосов
/ 17 октября 2011

Хорошо, я нашел решение для моей проблемы.Очевидно, читая документацию по флагу WebMethod, я пропустил свойство CacheDuration.Так как я пытался кэшировать вывод моих методов, просто изменив

[WebMethod]

на

[WebMethod(CacheDuration = (60*60*24*2))]

, исправил это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...