Mise en œuvre d'une cache dans un Service WCF
J'ai un service WCF qui met en cache certaines données et les utilise pour répondre à des demandes web. Pour faire face à cette exigence, j'ai fait le service d'un Singleton (à l'aide de InstanceContextMode.Single
et ConcurrencyMode.Multiple
(oui, c'est thread-safe)).
J'ai essayé de définir le délai d'attente du service à son maximum à l'aide de la liaison suivants:
<binding name="WebHttpBinding" receiveTimeout="24.20:31:23.6470000">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="None" />
</security>
</binding>
Mon problème est que l'instance de service meurt à intervalles imprévisibles, la première requête web de hit sera la cause de la cache pour obtenir la reconstruction d'un processus très lent).
Idéalement, le cache de la reconstruction à un temps de jeu chaque jour sans avoir à se faire frapper par une requête web. Je pourrais définir le pool d'application de recycler à un moment donné, mais ce n'est pas de résoudre le problème du service à ne pas se instancié jusqu'à la première requête web. Je préfère ne pas avoir à faire un peu prévu script qui envoie une demande pour le service, qui est une sorte de hacky.
Est-il une meilleure stratégie pour la réalisation de la mise en cache dans un service WCF? Ce que d'autres ont fait ici? Est-il une meilleure pratique?
Comment vous organisez le service? IIS?
Êtes-vous de fournir les données de retour à l'appelant directement ou à l'aide de ces données dans le cadre du traitement?
OriginalL'auteur MgSam | 2013-09-26
Vous devez vous connecter pour publier un commentaire.
Il y a un article MSDN sur La mise en cache de Soutien pour les Web Services HTTP, un extrait est cité ci-dessous:
Vous pouvez également regarder:
OriginalL'auteur VS1
J'ai mis en œuvre la mise en cache sur une couche supérieure à l'intérieur du webservice.
De cette façon, vous pouvez décider d'invalider le cache, et quand désérialiser à partir du disque.
Assurez-vous que le cache est construit avant la première webrequest, ajouter un peu de code pour
global.asax
pour générer le cache lors de la charge du serveur web.C'est beaucoup plus simple que de le faire de la "droit chemin"
Point de pris. Récente WCF frustration!
OriginalL'auteur Byron Whitlock
La
receiveTimeout
ne va pas affecter ce que vous essayez de faire. Vous devez utiliser AppFabric pour garder votre service toujours en cours d'exécution. De cette façon, chaque fois que vous recyclez, AppFabric automatiquement réchauffer votre service. Assurez-vous que votre cache est construit dès que votre service est instancié, pas quand il est d'abord accessible.OriginalL'auteur zimdanen
Vous pouvez utiliser IIS7 application de chauffe module
http://blogs.iis.net/thomad/archive/2009/10/14/now-available-the-iis-7-5-application-warm-up-module.aspx
OriginalL'auteur Softlion
Une option que vous pouvez utiliser est de déplacer le cache de la WCF service et dans une cache de service tels que Memcached ou de l'utilisation Microsoft AppFabric La Mise En Cache
Cela vous permet de séparer le stockage de données en mémoire cache de la WCF service, de sorte que vous avez plus de liberté dans votre architecture de la façon dont les données sont gérées et accessible.
OriginalL'auteur Alan Barber