Procedura: scambiare messaggi in una sessione affidabile
In questo argomento vengono delineati i passaggi necessari per attivare una sessione affidabile utilizzando una delle associazioni fornite dal sistema che supportano tale sessione, ma non per impostazione predefinita. È possibile abilitare una sessione affidabile in modo imperativo usando codice o in modo dichiarativo nel file di configurazione. In questa procedura vengono usati i file di configurazione del client e del servizio per attivare la sessione affidabile e stabilire che i messaggi arrivino nello stesso ordine di invio.
La parte chiave di questa procedura consiste nel fatto che l'elemento di configurazione dell'endpoint contiene un attributo bindingConfiguration
che fa riferimento a una configurazione di binding denominata Binding1
. L'elemento di configurazione <binding> fa quindi riferimento a questo nome per abilitare sessioni affidabili impostando l'attributo enabled
dell'elemento <reliableSession> su true
. Le garanzie di recapito ordinato per la sessione affidabile vengono specificate impostando l'attributo ordered
su true
.
Per la copia di origine di questo esempio, vedere WS Reliable Session.
Configurare il servizio con una classe WSHttpBinding per usare una sessione affidabile
Definire un contratto di servizio per il tipo di servizio.
[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); }
Implementare il contratto di servizio in una classe del servizio. Si noti che le informazioni sull'indirizzo o sul binding non sono specificate nell'implementazione del servizio. Non è necessario scrivere codice per recuperare l'indirizzo o le informazioni di binding dal file di configurazione.
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; } }
Creare un file di Web.config per configurare un endpoint per l'elemento
CalculatorService
che usa l'elemento WSHttpBinding con sessione affidabile abilitata e recapito ordinato dei messaggi necessari.<?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>
Creare un file Service.svc che contenga la riga:
<%@ServiceHost language=c# Service="CalculatorService" %>
Posizionare il file Service.svc nella directory virtuale di Internet Information Services (IIS).
Configurare il client con una classe WSHttpBinding per usare una sessione affidabile
Usare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) dalla riga di comando per generare il codice dai metadati di servizio:
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
Il client generato contiene l'interfaccia
ICalculator
che definisce il contratto di servizio che l'implementazione del client deve soddisfare.//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'applicazione client generata contiene inoltre l'implementazione di
ClientCalculator
. Si noti che le informazioni sull'indirizzo e sul binding non sono specificate nell'implementazione del servizio. Non è necessario scrivere codice per recuperare l'indirizzo o le informazioni di binding dal file di configurazione.// 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 genera inoltre la configurazione per il client che usa la classe WSHttpBinding. Assegnare al file di configurazione il nome App.config quando si usa 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>
Creare un'istanza di
ClientCalculator
in un'applicazione, quindi chiamare le operazioni del servizio.//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(); } }
Compilare ed eseguire il client.
Esempio
Diverse associazioni fornite dal sistema supportano sessioni affidabili per impostazione predefinita. tra cui:
Per un esempio di come creare un binding personalizzato che supporti sessioni affidabili, vedere Procedura: Creare un binding di sessione affidabile personalizzato con HTTPS.