Предоставление интерфейса поиска для MemoryCache в службе Windows

Используя .net 4.6, у меня есть служба Windows с таймером, который просыпается каждый день в настроенное время, подключается к удаленной базе данных и кэширует некоторые данные в памяти с помощью класса MemoryCache:

        string id = rec.ID;
        string surname = rec.Surname;
        string dateOfBirth = rec.DateOfBirth;
        string agreement = rec.Agreement;                        
        CachedData cd = new CachedData(id, surname, dateOfBirth, agreement);

        MemoryCache.Default.Set(id, cd, new DateTimeOffset(DateTime.Now.AddDays(1)));

Мне нужно открыть интерфейс поиска в этом MemoryCache. У меня есть отдельная служба WCF, которая предоставляет интерфейс поиска, но я не знаю, как передать запрос/результат поиска между службой WCf и службой Windows, поэтому, если я получу идентификатор в службе WCf:

string id = HttpContext.Current.Request.QueryString.Get("id");

Я мог бы передать его службе Windows, которая искала бы его в кеше памяти и возвращала результат.

Я подписался на https://msdn.microsoft.com/en-us/library/ff649818.aspx для размещения службы wcf в службе Windows. В конце я просто добавил следующее в метод OnStart() класса Service1.cs моего WindowsService:

MemoryCache.Default.Set("K", "Hello World", new DateTimeOffset(DateTime.Now.AddDays(1)));

и предполагая, что, поскольку служба WCF (также называемая Service1.cs) теперь размещается в службе Windows и будет использовать один и тот же домен приложения, я изменил метод GetData по умолчанию в WCF следующим образом:

    public string GetData(int value)
    {            
        var kv = MemoryCache.Default["K"] as string;
        if (kv != null)
        {
            return kv;
        }
        else
        {
            return string.Format("Entered: {0}", value);
        }            
    }

Однако, когда я использую тестовый клиент и вызываю GetData, он не может найти кешированный элемент в MemoryCache.


person user1984695    schedule 16.03.2017    source источник


Ответы (2)


Вы не можете получить доступ к экземпляру MemoryCache из другого процесса, в котором размещается служба WCF.

Можете ли вы разместить службу WCF внутри Windows Service? В этом случае не будет никаких проблем с использованием экземпляра MemoryCahce, обновленного по таймеру в службе WCF.

person klashar    schedule 16.03.2017
comment
Спасибо. Пожалуйста, посмотрите мое редактирование исходного поста, так как я не мог разместить все это здесь. - person user1984695; 16.03.2017
comment
@ user1984695, трудно сказать, поскольку вы не предоставили минимальную программу, которая будет работать. Я предлагаю вам проверить, что AppDomain.CurrentDomain.FriendlyName одинаковы в обоих местах, когда вы работаете с кешем. Также вы можете проверить, поможет ли вам настройка конфигурации ‹memoryCache› - msdn.microsoft.com/en-us/library/dd941872(v=vs.110).aspx - person klashar; 16.03.2017

Я бы выбрал (постоянный) кеш вне вашего приложения, чтобы вы могли иметь несколько экземпляров, выполнять развертывания и т. Д., Без потери кэшированных данных (что произойдет, если ваши службы Windows перестанут работать в течение этих 24 часов сегодня?). Memcached и Redis — первые, о которых я думаю.

person Jocke    schedule 16.03.2017
comment
Я знаю о недостатках кэша в памяти. Это требование для этой задачи, и часть его заключается в том, что кеш будет перестроен при резервном копировании службы (когда что-то пойдет не так). - person user1984695; 17.03.2017