2013-09-26 3 views
4

У меня есть служба WCF, которая кэширует определенные данные и использует их для ответа на веб-запросы. Чтобы справиться с этим требованием, я сделал услугу Singleton (используя InstanceContextMode.Single и ConcurrencyMode.Multiple (да, это потокобезопасно)).Реализация кэша в службе WCF

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

<binding name="WebHttpBinding" receiveTimeout="24.20:31:23.6470000"> 
    <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="None" /> 
    </security> 
</binding> 

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

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

Есть ли лучшая стратегия для выполнения кеширования в службе WCF? Что сделали другие? Есть ли наилучшая практика?

+1

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Как вы размещаете услугу? IIS? –

+0

Вы * предоставляете данные обратно вызывающему абоненту напрямую *, или вы * используете данные как часть обработки *? – zimdanen

ответ

1

Я реализовал кеширование на более высоком уровне внутри webservice.

Таким образом, вы можете решить, когда нужно аннулировать кеш, а когда десериализовать с диска.

Чтобы убедиться, что кеш построен до первого веб-запроса, добавьте код global.asax, чтобы сгенерировать кеш при загрузке веб-сервера.

Это гораздо проще, чем делать это «right way»

[OperationContract] 
public void GetLargeComplexData(); 

public GetLargeComplexData() 
{ 
    // deserialize last cached data from db or file 
    ... 

    // Verify the deserialized cache is not invalid 
    ... 

    // if cache is invalid rebuild 
    ... 

    //return cached data 
    ... 
} 
+4

Этот ответ был бы лучше без вашего мнения о WCF. –

+1

Точка взята. Недавнее разочарование WCF! –

0

receiveTimeout не будет влиять на то, что вы пытаетесь сделать. Вы должны использовать AppFabric, чтобы ваш сервис всегда работал. Таким образом, всякий раз, когда вы перерабатываете, AppFabric автоматически разминка вашего сервиса. Просто убедитесь, что ваш кеш создается, когда ваша служба создается, а не когда она впервые открывается.

4

Существует статья MSDN на Caching Support for WCF Web HTTP Services, отрывок цитируется ниже:

В .NET Framework версии 4 позволяет использовать механизм декларативного кэширования, уже доступный в ASP.NET в ваших веб-HTTP-службах WCF. Это позволяет кэшировать ответы из ваших служб WCF Web HTTP. Когда пользователь отправляет HTTP GET в вашу службу, настроенную для кэширования, ASP.NET отправляет обратно кешированный ответ, и метод службы не вызывается. Когда кеш истекает, в следующий раз, когда пользователь отправляет HTTP GET, вы вызываете свой метод обслуживания, и ответ снова кэшируется ..........

Вы также можете посмотреть по адресу:

+1

Этот ответ лучше, чем другие, поскольку он действительно решает вопрос и использует инструменты, доступные на платформе, но требуется больше объяснений и, возможно, пример. На данный момент это в основном свалка ссылок. –

0

Опция вы можете использовать это, чтобы переместить кэш из службы WCF и в специальную службу кэша, такие как Memcached или использовать Microsoft AppFabric Caching

Это позволяет отделить хранение кэшированных данных из WCF, чтобы у вас было больше свободы в вашей архитектуре управления и доступа к данным.

Смежные вопросы