Кэширование объектов в службе RESTful WCF

#c# #wcf #caching #rest

#c# #wcf #кэширование #rest

Вопрос:

Я ищу способ кэширования объектов в памяти с помощью службы RESTful WCF. Служба полностью не имеет состояния и размещается вне IIS. Я хочу реализовать кэширование самостоятельно, поэтому memcached не вариант.

Прямо сейчас я подумываю о размещении отдельного stateful System.ServiceModel.ServiceHost , который выполняет все кэширование. Он будет взаимодействовать с остальными методами WCF через отдельный порт или каким-либо другим способом. Однако я не уверен, что это идеальное решение моей проблемы. У кого-нибудь есть какие-нибудь советы?

Комментарии:

1. Служба не имеет состояния, и это прекрасно. Но, но когда вы говорите «настройте другой сервер обслуживания с отслеживанием состояния», это ошибка. Узел службы отслеживает состояние ipso facto, потому что на нем размещается служба. Почему бы не использовать один и тот же хост для кэширования потоков изображений в памяти? Я не вижу смысла иметь два отдельных хоста службы.

2. @anas: Вы, конечно, правы, но как еще я могу сохранить что-то в памяти, когда служба полностью не имеет состояния?

Ответ №1:

Я понимаю вашу путаницу между службой без состояния и хостом с сохранением состояния и тем, как они могут взаимодействовать.

В этом примере кода я концептуально демонстрирую, как на одноэлементный элемент в памяти (механизм кэширования, который я называю CachingProvider далее) могут ссылаться как класс службы (точнее, экземпляр службы в течение жизненного цикла запроса), так и хост службы (в данном случае я выбрал его в качестве консольного приложения)

Я предполагаю, что здесь интерфейс службы и класс расположены в проекте консольного приложения, в котором размещается служба.

В этом простом примере мой примитивный CachingProvider класс в основном действует как счетчик количества вызовов служб, выполненных методом getData, и хост службы будет опрашивать CachingProvider каждые 5 секунд, чтобы получить количество вызовов служб, выполненных на данный момент.

примечание: вы можете использовать утилиту WcfTestClient, чтобы быстро протестировать это.

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

 namespace ServiceHostConsole
{
    [ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        string GetData(int value);
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class TestService : ITestService
    {
        public TestService()
        {
            CachingProvider.CallCount  ;
        }

        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
    }

    //For demonstration purposes only
    static class CachingProvider
    {
        static CachingProvider()
        {
            //private static constructor can initialize 
            //static cacheable resources
            _callCounter = 0; //Trivial example of initialization
        }

        private static int _callCounter;
        public static int CallCount
        {
            set { _callCounter = value; }
            get { return _callCounter; }
        }
    }

    class Program
    {
        static void Main()
        {
            using (var host = new ServiceHost(typeof(TestService), new Uri("http://localhost/TestService")))
            {
                host.Open();

                //Example how the ServiceHost can report on a persistent in-memory object that is being
                //updated each time the service is called.
                new Timer(state => Console.WriteLine("# of service calls: {0}", CachingProvider.CallCount), null, 0, 5000);

                Console.Read();
                host.Close();
            }
        }
    }
}
  

Комментарии:

1. Теперь я понимаю. Хороший пример и спасибо за разъяснение.