Procedure: Berichten uitwisselen binnen een betrouwbare sessie
In dit onderwerp worden de stappen beschreven die nodig zijn om een betrouwbare sessie in te schakelen met behulp van een van de door het systeem geleverde bindingen die ondersteuning bieden voor een dergelijke sessie, maar niet standaard. U schakelt een betrouwbare sessie imperatief in met behulp van code of declaratief in uw configuratiebestand. In deze procedure worden de client- en serviceconfiguratiebestanden gebruikt om de betrouwbare sessie in te schakelen en te bepalen dat de berichten in dezelfde volgorde binnenkomen waarin ze zijn verzonden.
Het belangrijkste onderdeel van deze procedure is dat het eindpuntconfiguratie-element een bindingConfiguration
kenmerk bevat dat verwijst naar een bindingsconfiguratie met de naam Binding1
. Het <bindingsconfiguratie-element> verwijst naar deze naam om betrouwbare sessies mogelijk te maken door het enabled
kenmerk van het <reliableSession-element> in te stellen op .true
U geeft de bestelde leveringsgaranties voor de betrouwbare sessie op door het ordered
kenmerk in te stellen op true
.
Zie WS Reliable Session voor de bronkopie van dit voorbeeld.
De service configureren met een WSHttpBinding voor het gebruik van een betrouwbare sessie
Definieer een servicecontract voor het type 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); }
Implementeer het servicecontract in een serviceklasse. Houd er rekening mee dat het adres of de bindingsinformatie niet is opgegeven in de implementatie van de service. U hoeft geen code te schrijven om het adres of de bindingsgegevens op te halen uit het configuratiebestand.
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; } }
Maak een Web.config-bestand om een eindpunt te configureren voor het
CalculatorService
eindpunt dat gebruikmaakt van de WSHttpBinding betrouwbare sessie ingeschakeld en bestelde bezorging van berichten die vereist zijn.<?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>
Maak een Service.svc-bestand dat de regel bevat:
<%@ServiceHost language=c# Service="CalculatorService" %>
Plaats het bestand Service.svc in de virtuele map Internet Information Services (IIS).
De client configureren met een WSHttpBinding om een betrouwbare sessie te gebruiken
Gebruik het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) vanaf de opdrachtregel om code te genereren op basis van servicemetagegevens:
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
De gegenereerde client bevat de
ICalculator
interface die het servicecontract definieert waaraan de client-implementatie moet voldoen.//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); }
De gegenereerde clienttoepassing bevat ook de implementatie van de
ClientCalculator
. Houd er rekening mee dat het adres en de bindingsinformatie nergens in de implementatie van de service zijn opgegeven. U hoeft geen code te schrijven om het adres of de bindingsgegevens op te halen uit het configuratiebestand.// 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 genereert ook de configuratie voor de client die gebruikmaakt van de WSHttpBinding klasse. Geef het configuratiebestand App.config een naam wanneer u Visual Studio gebruikt.
<?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>
Maak een exemplaar van de
ClientCalculator
in een toepassing en roep de servicebewerkingen aan.//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(); } }
Compileer en voer de client uit.
Opmerking
Verschillende van de door het systeem geleverde bindingen ondersteunen standaard betrouwbare sessies. Deze omvatten:
Voor een voorbeeld van het maken van een aangepaste binding die betrouwbare sessies ondersteunt, raadpleegt u Procedure: Een aangepaste betrouwbare sessiebinding maken met HTTPS.