File Persistence Provider, exemple
Cet exemple comment montre comment créer un fournisseur de persistance qui fonctionne avec des services fiables. L'état de l'instance de service est stocké dans les fichiers sur votre ordinateur.
L'exemple contient également une implémentation du service de calculatrice, qui est le même que le Services fiables. La différence est que ce service utilise le fournisseur de persistance du fichier créé dans l'exemple plutôt que le fournisseur de persistance Locking SQL standard.
Remarque : |
---|
Cet exemple requiert l'installation de .NET Framework version 3.5 pour être généré et exécuté. Visual Studio 2008 est nécessaire pour l'ouverture des fichiers projet et solution. |
L'Calculator Client, exemple doit être exécuté avec ce service (Pour plus d'informations, consultez , procédures d'installation fournies à la fin de cette rubrique).
File Persistence Provider
Le fournisseur de persistance du fichier de cet exemple est défini dans le fichier FilePersistenceProviderFactory.cs. Notez que la classe FilePersistenceProvider
réelle se trouve dans une classe incorporée. Pour créer le fournisseur de persistance du fichier, on utilise un modèle de fabrique dans lequel la fabrique transmet la classe du fournisseur de persistance réelle à l'exécution du service si nécessaire. C'est la méthode standard pour créer des fournisseurs dans WCF.
La classe de la fabrique du fournisseur de persistance du fichier hérite de la classe abstraite PersistenceProviderFactory
. La classe abstraite PersistenceProviderFactory
est définie dans le code suivant.
namespace System.ServiceModel.Persistence
{
public abstract class PersistenceProviderFactory : CommunicationObject
{
protected PersistenceProviderFactory();
public abstract PersistenceProvider CreateProvider(Guid id);
}
}
Notez que PersistenceProviderFactory
hérite de la classe abstraite CommunicationObject
. CommunicationObject
fournit les méthodes requises pour la gestion de la durée de vie de l'objet tout au long de son utilisation dans l'exécution du service.
Le modèle de fabrique du fournisseur garantit que la fabrique gère toutes ressources qui sont communes à toutes les instances du fournisseur. Par exemple, dans le cas du fournisseur de persistance du fichier, la fabrique peut déterminer l'emplacement dans lequel les fichiers de persistance sont stockés puis partagés entre toutes les instances du fournisseur de persistance du fichier réel.
En conséquence, il y a une instance du fournisseur pour chaque instance du service. Il y a également une instance de la fabrique pour chaque hôte.
Le fournisseur de persistance du fichier hérite lui-même de la classe abstraite PersistenceProvider
. Cette classe est définie dans le code suivant.
namespace System.ServiceModel.Persistence
{
public abstract class PersistenceProvider : CommunicationObject
{
protected PersistenceProvider(Guid id);
public Guid Id { get; }
public abstract IAsyncResult BeginCreate(object instance, TimeSpan timeout, AsyncCallback callback, object state);
public abstract IAsyncResult BeginDelete(object instance, TimeSpan timeout, AsyncCallback callback, object state);
public abstract IAsyncResult BeginLoad(TimeSpan timeout, AsyncCallback callback, object state);
public virtual IAsyncResult BeginLoadIfChanged(TimeSpan timeout, object instanceToken, AsyncCallback callback, object state);
public abstract IAsyncResult BeginUpdate(object instance, TimeSpan timeout, AsyncCallback callback, object state);
public abstract object Create(object instance, TimeSpan timeout);
public abstract void Delete(object instance, TimeSpan timeout);
public abstract object EndCreate(IAsyncResult result);
public abstract void EndDelete(IAsyncResult result);
public abstract object EndLoad(IAsyncResult result);
public virtual bool EndLoadIfChanged(IAsyncResult result, out object instance);
public abstract object EndUpdate(IAsyncResult result);
public abstract object Load(TimeSpan timeout);
public virtual bool LoadIfChanged(TimeSpan timeout, object instanceToken, out object instance);
public abstract object Update(object instance, TimeSpan timeout);
}
}
La classe du fournisseur de persistance est également un objet de communication. Il y a 4 méthodes dans le fournisseur de persistance : Create()
, Update()
, Load()
et Delete()
. Les variantes asynchrones de ces méthodes sont définies ainsi que leurs surcharges. Les règles suivantes s'appliquent au stockage de l'état de l'instance dans les fichiers :
- Les fichiers réels sont stockés dans un répertoire nommé FilePersistenceProvider dans le répertoire Temp sur l'ordinateur qui héberge le service.
- L'état d'une instance est stocké dans un fichier dont le nom est l'unique identificateur de l'instance. Ce fichier est stocké avec une extension .bin.
- Lorsqu'un fichier doit être supprimé, il ne l'est pas réellement, mais est renommé comme « supprimé ».
Configuration du fournisseur de persistance
Avant d'être utilisé, le fournisseur de persistance du fichier doit être spécifié dans le fichier de configuration du service. La configuration du fournisseur de persistances est spécifiée dans la section servicebBehaviors
du fichier de configuration. Cet exemple illustre l'entrée dans le fichier Web.config.
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior" >
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<windowsAuthentication allowAnonymousLogons="false" includeWindowsGroups="true" />
</serviceCredentials>
<persistenceProvider type="Microsoft.WorkflowServices.Samples.FilePersistenceProviderFactory, DurableServiceFactory, Version=1.0.0.0"/>
</behavior>
</serviceBehaviors>
</behaviors>
Code de service fiable - contrat de service
Le code suivant illustre le contrat de service pour le service de calculatrice.
[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
public interface ICalculator
{
[OperationContract()]
int PowerOn();
[OperationContract()]
int Add(int value);
[OperationContract()]
int Subtract(int value);
[OperationContract()]
int Multiply(int value);
[OperationContract()]
int Divide(int value);
[OperationContract()]
void PowerOff();
}
Implémentation du service
Dans le code suivant, l'attribut DurableServiceAttribute est utilisé dans l'implémentation du service pour spécifier qu'il s'agit d'un service fiable.
[Serializable]
[DurableService]
public class DurableCalculator : ICalculator
{
int currentValue = default(int);
[DurableOperation(CanCreateInstance=true)]
public int PowerOn()
{
return currentValue;
}
[DurableOperation()]
public int Add(int value)
{
return (currentValue += value);
}
[DurableOperation()]
public int Subtract(int value)
{
return (currentValue -= value);
}
[DurableOperation()]
public int Multiply(int value)
{
return (currentValue *= value);
}
[DurableOperation()]
public int Divide(int value)
{
return (currentValue /= value);
}
[DurableOperation(CompletesInstance=true)]
public void PowerOff()
{
}
}
L'attribut DurableOperationAttribute indique que l'état de l'instance est enregistré une fois l'opération terminée.
Deux paramètres peuvent être utilisés dans l'attribut DurableOperationAttribute. La propriété CanCreateInstance spécifie que l'instance est créée lorsque cette opération est appelée. La propriété CompletesInstance spécifie que l'instance de service est terminée une fois l'exécution de l'opération sur laquelle cet attribut est spécifié terminée. L'état est également supprimé de la base de données une fois l'opération terminée.
Le code suivant illustre le fichier .svc pour héberger cet exemple dans les services IIS (Internet Information Services).
<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
La liaison du service est configurée dans le fichier Web.config. La liaison WSHttpContextBinding permet de conserver le contexte utilisé pour acheminer des demandes à une instance particulière de l'application. L'entrée qui indique le fournisseur de persistance se trouve dans la section ServiceBehaviors
.
Pour configurer, générer et exécuter l'exemple
Assurez-vous d'avoir suivi les instructions d'installation de la section Procédure d'installation unique pour les exemples Windows Communication Foundation.
Dans IIS, activez l'authentification Windows sur le répertoire virtuel ServiceModelSamples.
Pour activer l'authentification Windows dans IIS 5.1 ou 6.0 :
- Ouvrez une fenêtre d'invite de commandes et tapez start inetmgr pour ouvrir le composant logiciel enfichable MMC des services IIS.
- Cliquez avec le bouton droit sur la racine virtuelle ServiceModelSamples à l'intérieur de Site Web par défaut, cliquez sur Propriétés, puis cliquez sur l'onglet Sécurité de répertoire.
- Sous Authentification et contrôle d'accès, cliquez sur Modifier.
- Dans la boîte de dialogue Méthodes d'authentification, sélectionnez Authentification intégrée Windows.
Pour activer l'authentification Windows dans IIS 7.0 :
- Ouvrez une fenêtre d'invite de commandes, puis tapez start inetmgr pour ouvrir le composant logiciel enfichable MMC des services IIS (Internet Information Services).
- Sélectionnez la racine virtuelle ServiceModelSamples à l'intérieur de Site Web par défaut.
- À l'intérieur du volet d'accueil ServiceModelSamples, double-cliquez sur Authentification à l'intérieur du groupe IIS.
- Sélectionnez Authentification Windows, puis l'action Activer.
Générez le projet. Le projet génère et met à jour ServiceModelSamples.
Pour vous assurer que le service est correctement installé, pointez sur l'adresse https://localhost/servicemodelsamples/service.svc. Vous devez voir apparaître la page d'aide du service. Pour consulter WSDL (Web Services Descriptor Language), tapez https://localhost/servicemodelsamples/service.svc?wsdl.
Pour exécuter cet exemple, vous devez utiliser Calculator Client, exemple. Il s'agit de l'interface utilisateur de calculatrice créée à l'aide de Windows Presentation Foundation (WPF), laquelle remplit le rôle de client pour le service. Pour tester la fiabilité du service, fermez le client et rouvrez-le pendant que le service de calculatrice s'exécute. Le client calculatrice répond à la même instance de service et affiche l'ID de l'instance en bas. Le client calculatrice utilise un fichier texte appelé Client.ctx pour stocker le contexte dans un endroit durable la première fois qu'un appel est passé (dans le cas présent, dans le répertoire \bin de votre exemple). Lorsque vous rouvrez le client, il vérifie si le fichier est présent. Si tel est le cas, il applique le contexte stocké au canal créé. Si le service a terminé et si vous ouvrez le client à l'aide du fichier Client.ctx figurant encore dans votre répertoire \bin, celui-ci essaie d'appliquer le contexte au canal. Vous obtenez alors une erreur car le service avec lequel vous souhaitez communiquer n'est pas présent. Supprimez le fichier et réessayez.
Vous pouvez également recycler le service en redémarrant IIS. Étant donné que vous utilisez un magasin de persistances après chaque opération, l'état du service est stocké. Par conséquent, lorsque vous essayez de communiquer avec le service depuis le client après avoir redémarré IIS, l'infrastructure du service reçoit l'instance du magasin de persistances et vous pouvez communiquer à l'aide de la même instance.
Remarque : Lorsque vous appelez une opération pour la première fois après avoir redémarré IIS, vous recevez une exception MessageSecurityException, provoquée par un jeton de sécurité périmé sur le canal. Appelez une autre opération et elle réussira.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.