7
votes

La durée de vie d'une instance d'un service WCF?

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 { ...


0 commentaires

4 Réponses :


11
votes

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 le instancecontextmode 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();
    }
}


3 commentaires

Donc, si j'avais une propriété dans mon Evalervice de type list et j'ai ajouté une valeur à l'aide d'un client, je serais en mesure d'accéder à cette liste d'un client différent (en supposant que je le sais bien sûr)?


c'est vrai, c'est toujours la même liste . et aussi prendre soin de la ConcurrencyMode!


Désolé - j'étais lors d'une réunion. @blindmeis est correct. J'ai ajouté un exemple pour démontrer.



0
votes

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.

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 ServiceHost est ouvert).


0 commentaires

0
votes

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.

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).


0 commentaires

4
votes

instanceContextMode.single correspond à un service singleton I.e. Le côté du serveur d'instance de service est le même pour toutes les demandes entrantes.

Quelques commentaires:

  • Votre service peut être résilié par l'hôte même s'il s'agit d'un singleton, c'est probablement le cas si votre service est hébergé dans IIS
  • C'est le contexte d'instance qui est un singleton qui pourrait être dissocié des instances de service actuelles (mais gardons-le simples pour l'instant ...)
  • Si une exception n'est pas prise correctement dans un service singleton, cela pourrait empêcher toute demande ultérieure de réussir

1 commentaires

Pourquoi IIS met fin au service? En raison de la recyclage de l'application ou de toute autre raison?