Procédure : échanger des messages au sein d’une session fiable
Cette rubrique décrit les étapes requises pour activer une session fiable utilisant l’une des liaisons fournies par le système qui prennent en charge une telle session, mais pas par défaut. Vous activez une session fiable de manière impérative à l’aide du code ou de manière déclarative dans votre fichier de configuration. Cette procédure utilise les fichiers de configuration du client et du service pour activer la session fiable et pour stipuler que les messages arrivent dans l’ordre dans lequel ils ont été envoyés.
La partie clé de cette procédure est que l’élément de configuration du point de terminaison contient un attribut bindingConfiguration
qui fait référence à une configuration de liaison nommée Binding1
. L’élément de configuration <binding> fait référence à ce nom pour activer les sessions fiables en définissant l’attribut enabled
de l’élément <reliableSession> sur true
. Vous spécifiez les assurances de remise ordonnée pour la session fiable en affectant à l'attribut ordered
la valeur true
.
Pour obtenir la copie source de cet exemple, consultez Session fiable WS.
Configurer le service avec une liaison WSHttpBinding pour utiliser une session fiable
Définissez un contrat de service pour le type de service.
[ServiceContract] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); }
Implémentez le contrat de service dans une classe de service. Notez que l’adresse ou les informations de liaison ne sont pas spécifiées dans l’implémentation du service. Vous n’êtes pas obligé d’écrire du code pour récupérer l’adresse ou les informations de liaison dans le fichier de configuration.
public class CalculatorService : ICalculator { public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Multiply(double n1, double n2) { return n1 * n2; } public double Divide(double n1, double n2) { return n1 / n2; } }
Créez un fichier Web.config afin de configurer un point de terminaison pour l’élément
CalculatorService
qui utilise WSHttpBinding avec la session fiable activée et la livraison ordonnée des messages requis.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService"> <!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc Specify wsHttpBinding binding and a binding configuration to use --> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <!-- Configures WSHttpBinding for reliable sessions with ordered delivery. --> <bindings> <wsHttpBinding> <binding name="Binding1"> <reliableSession enabled="true" ordered="true" /> </binding> </wsHttpBinding> </bindings> </system.serviceModel> </configuration>
Créez un fichier Service.svc qui contient la ligne :
<%@ServiceHost language=c# Service="CalculatorService" %>
Placez le fichier Service.svc dans votre répertoire virtuel IIS (Internet Information Services).
Configurer le client avec une liaison WSHttpBinding pour utiliser une session fiable
Utilisez l’outil ServiceModel Metadata Utility Tool (Svcutil.exe) depuis la ligne de commande pour générer du code à partir des métadonnées de service :
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
Le client généré contient l’interface
ICalculator
qui définit le contrat de service que l’implémentation du client doit satisfaire.//Generated interface defining the ICalculator contract [System.ServiceModel.ServiceContractAttribute( Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="Microsoft.ServiceModel.Samples.ICalculator")] public interface ICalculator { [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")] double Add(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")] double Subtract(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")] double Multiply(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")] double Divide(double n1, double n2); }
L'application cliente générée contient également l'implémentation de
ClientCalculator
. Notez que l’adresse et les informations de liaison ne sont spécifiées nulle part dans l’implémentation du service. Vous n’êtes pas obligé d’écrire du code pour récupérer l’adresse ou les informations de liaison dans le fichier de configuration.// Implementation of the CalculatorClient public partial class CalculatorClient : System.ServiceModel.ClientBase<Microsoft.ServiceModel.Samples.ICalculator>, Microsoft.ServiceModel.Samples.ICalculator { public CalculatorClient() { } public CalculatorClient(string endpointConfigurationName) : base(endpointConfigurationName) { } public CalculatorClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public CalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } public double Add(double n1, double n2) { return base.Channel.Add(n1, n2); } public double Subtract(double n1, double n2) { return base.Channel.Subtract(n1, n2); } public double Multiply(double n1, double n2) { return base.Channel.Multiply(n1, n2); } public double Divide(double n1, double n2) { return base.Channel.Divide(n1, n2); } }
Svcutil.exe génère également la configuration du client qui utilise la classe WSHttpBinding. Nommez le fichier de configuration App.config lorsque vous utilisez Visual Studio.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <!-- Specify wsHttpBinding binding and a binding configuration to use --> <endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </client> <!-- Configures WSHttpBinding for reliable sessions with ordered delivery --> <bindings> <wsHttpBinding> <binding name="Binding1"> <reliableSession enabled="true" ordered="true" /> </binding> </wsHttpBinding> </bindings> </system.serviceModel> </configuration>
Créez une instance de
ClientCalculator
dans une application et appelez les opérations de service.//Client implementation code. class Client { static void Main() { // Create a client with given client endpoint configuration CalculatorClient client = new CalculatorClient(); // Call the Add service operation. double value1 = 100.00D; double value2 = 15.99D; double result = client.Add(value1, value2); Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; result = client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; result = client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; result = client.Divide(value1, value2); Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); //Closing the client gracefully closes the connection and cleans up resources client.Close(); Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } }
Compilez, puis exécutez le client.
Exemple
Plusieurs liaisons fournies par le système prennent en charge des sessions fiables par défaut. Il s’agit notamment des paramètres suivants :
Pour obtenir un exemple de création de liaison personnalisée prenant en charge les sessions fiables, consultez Procédure : Créer une liaison de session fiable personnalisée avec HTTPS.