Quelle est la règle générale pour décider d’utiliser PerSession ou PerCall?
J’ai un service WCF un peu lourd (je pense ..), contenant des méthodes CRUD à environ 80 tables.
J’ai divisé le service WCF en 7 contrats au sein d’un service (c.-à-d. 7 points finaux au sein d’un service), de sorte que chaque contrat prenne en charge son propre domaine. Par exemple, j’ai un contrat de vente. Toutes les tables liées aux ventes et les opérations correspondantes se situent dans le “contexte délimité” des ventes
Donc, ma structure de service WCF ressemble à ceci:
public partial class ABCService : ISalesService { //CRUD methods of all tables related to Sales } public partial class ABCService : IMarketingService { //CRUD methods of all tables related to Marketing } public partial class ABCService : ICustomerService { //CRUD methods of all tables related to Customer } public partial class ABCService : IProductService { //CRUD methods of all tables related to Products }
Mon problème avec PerCall est que, du fait que je dispose d’un service DB / WCF assez important, je crains que la quantité de ressources consommée par chaque appel, multipliée par le nombre d’utilisateurs et la vitesse à laquelle ils appellent le service, serait beaucoup trop grand.
Je ne connais pas les détails, mais j’ai lu que la création d’un proxy de canal est une opération coûteuse.
Oh, j’utilise des proxies codés manuellement au lieu de la référence de service Add de VS pour utiliser mon service WCF.
Donc, ma question est, que devrais-je utiliser? PerSession ou PerCall?
Mettre à jour:
A mon avis, pour prendre une décision, considérez ces deux points
InstanceContextMode.PerSession
– Si vos utilisateurs ont des valeurs de session stockées sur le service WCF sur le serveur. InstanceContextMode.PerCall
– Si vos utilisateurs n’ont rien stocké en session sur le service WCF sur le serveur, c’est-à-dire que le service WCF nécessite Aucun paramètre par utilisateur requirejs pour le stockage en mémoire. Nécessite une évolutivité. Quelques points concernant Quand et pourquoi?
PerCall
, il n’y aura que 100 objects instanciés pour 100 appels actifs . Deuxièmement, si le serveur devait tomber en PerCall
dans la situation PerCall
, les seules erreurs qui se produiraient concerneraient les 100 demandes réelles en cours (en supposant un basculement rapide). Les 900 autres clients pourraient être routés vers un autre serveur lors de leur prochain appel. PerSession
, vous pouvez avoir 1 000 objects instanciés sur le serveur, mais seulement 100 sont réellement actifs en appel à tout moment. Ainsi, les objects PerSession
instanciés peuvent constituer un gaspillage de ressources et avoir une incidence sur la capacité de répondre aux demandes sous charge. Deuxièmement, si le serveur devait tomber en panne, alors dans PerSession
les 1 000 clients ayant une session sur ce serveur perdraient leur session et seraient incapables de terminer leur travail. Liens de référence:
La raison pour laquelle vous ne voyez pas beaucoup de réponses à ce type de question en ligne est que cela dépend. Ce que je voudrais faire est de l’essayer – puis ouvrez perfmon sur le serveur sur lequel vous hébergez le service et ajoutez les compteurs pour votre service. Si vous n’êtes pas familier, utilisez simplement Google wcf performance manager.
La bonne nouvelle est que WCF facilite les modifications de configuration.
Si vous êtes préoccupé par le coût de l’instanciation d’un proxy côté client, rappelez-vous que perCall est un comportement de service, pas un comportement de client. Même si vous définissez le contexte d’instance de service sur PerCall, vous pouvez toujours créer une instance de votre proxy et effectuer un ensemble d’appels de méthode à partir de ce proxy. Tout ce que perCall signifie, c’est que lorsque vous appelez, une instance du service est créée, votre méthode est appelée et l’instance du service est à nouveau détruite. Si vous n’avez pas d’initialisation coûteuse sur l’instance de service (c’est-à-dire s’il s’agit de méthodes essentiellement statiques), vous êtes probablement d’accord avec chaque appel.