#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. Теперь я понимаю. Хороший пример и спасибо за разъяснение.