Dans le processus de création d'un service de WCF, j'ai rencontré un terme qui est nouveau pour moi. Fondamentalement, lorsque vous spécifiez le instancecontextMode code> J'ai quelques options, y compris; Persession code>, percall code> et unique code>. Voici le code de l'échantillon que j'apprends de: [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class EvalService : IEvalService { ...
4 Réponses :
par les docs:
Un seul objet instancecontext est utilisé pour tous les appels entrants et est non recyclé après les appels. Si un objet de service ne fait pas existe, on est créé. p> blockQuote>
Il n'y a donc qu'une seule instance, et elle n'est pas nettoyée après que l'appel soit effectué. C'est comme un singleton pour votre service WCF. Vous devez donc faire attention à la mémoire et aux ressources partagées. P>
Pour répondre à votre question - oui, c'est la façon dont cela fonctionne. P>
Mise à jour strong> : J'ai modifié quelques échantillons de MSDN pour afficher les effets de
instancecontextmode.single code>. Vous verrez que le nombre d'opérations continuera d'incrémenter même si j'utilise deux clients différents. Si je modifie leinstancecontextmode code> àpercall code>, le nombre sera différent (il sera zéro). P>Service auto-hébergé: P>
XXX PRE> Client: P>
class Program { static void Main() { // Create a client. CalculatorInstanceClient client = new CalculatorInstanceClient(); string instanceMode = client.GetInstanceContextMode(); Console.WriteLine("InstanceContextMode: {0}", instanceMode); Console.WriteLine("client1's turn"); Console.WriteLine("2 + 2 = {0}", client.Add(2, 2).ToString()); Console.WriteLine("3 - 1 = {0}", client.Subtract(3, 1).ToString()); Console.WriteLine("number of operations = {0}", client.GetOperationCount().ToString()); // Create a second client. CalculatorInstanceClient client2 = new CalculatorInstanceClient(); Console.WriteLine("client2's turn"); Console.WriteLine("2 + 2 = {0}", client2.Add(2, 2).ToString()); Console.WriteLine("3 - 1 = {0}", client2.Subtract(3, 1).ToString()); Console.WriteLine("number of operations = {0}", client2.GetOperationCount().ToString()); Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } }
Donc, si j'avais une propriété dans mon Evalervice de type list
c'est vrai, c'est toujours la même liste
Désolé - j'étais lors d'une réunion. @blindmeis est correct. J'ai ajouté un exemple pour démontrer.
Cela signifie qu'une seule instance de votre classe est créée par WCF. Toutes les demandes sont traitées par cette instance. Les problèmes de multithreading et de concurrence inclus. P>
Bien que ce soit probablement un détail de mise en œuvre, je doute que votre classe soit persisté (il faudrait être sérialisable pour cela, ce qui n'est pas une exigence). L'une fois qu'il existe simplement aussi longtemps que nécessaire (c'est-à-dire le service code> ServiceHost code> est ouvert). P>
Oui, le partage de l'instance de service signifie qu'il n'y a qu'une seule instance créée par le serveur, partagée entre les demandes. p>
En particulier, le constructeur de l'objet de service sera appelé une fois, lorsque l'instance est créée. Cela peut être important, par exemple, si vous utilisez une certaine forme d'authentification avec l'identité de l'identité du contexte (les instances partagées pourraient potentiellement nécessiter des travaux supplémentaires pour gérer ces cas). P>
Quelques commentaires: P>
instanceContextMode.single code> correspond à un service singleton I.e. Le côté du serveur d'instance de service est le même pour toutes les demandes entrantes. P>
Pourquoi IIS met fin au service? En raison de la recyclage de l'application ou de toute autre raison?