Delen via


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

  1. 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);
    }
    
  2. 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;
        }
    }
    
  3. 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>
    
  4. Maak een Service.svc-bestand dat de regel bevat:

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. 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

  1. 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>
    
  2. 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);
    }
    
  3. 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);
        }
    }
    
  4. 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>
    
  5. 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();
        }
    }
    
  6. 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.

Zie ook