Delen via


Procedure: Een clientbinding opgeven in configuratie

In dit voorbeeld wordt een clientconsoletoepassing gemaakt voor het gebruik van een rekenmachineservice en wordt de binding voor die client declaratief opgegeven in de configuratie. De client opent de CalculatorService, waarmee de ICalculator-interface wordt geïmplementeerd en zowel de service als de client de BasicHttpBinding-klasse gebruikt.

Bij de beschreven procedure wordt ervan uitgegaan dat de rekenmachineservice actief is. Zie Hoe: Een Servicebinding Speciferen in Configuratievoor meer informatie over het bouwen van de service. Het maakt ook gebruik van het Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) dat Windows Communication Foundation (WCF) biedt voor het automatisch genereren van de clientonderdelen. Het hulpprogramma genereert de clientcode en configuratie voor toegang tot de service.

De client-applicatie bestaat uit twee delen. Svcutil.exe genereert de ClientCalculator waarmee de ICalculator-interface wordt geïmplementeerd. Deze clienttoepassing wordt vervolgens samengesteld door een exemplaar van ClientCalculatorte maken.

Het is meestal de aanbevolen procedure om de bindings- en adresgegevens declaratief op te geven in de configuratie in plaats van imperatief in code. Het definiëren van eindpunten in code is meestal niet praktisch omdat de bindingen en adressen voor een geïmplementeerde service doorgaans afwijken van de bindingen en adressen die worden gebruikt terwijl de service wordt ontwikkeld. Over het algemeen kunnen ze de bindings- en adresseringsgegevens buiten de code houden zonder de toepassing opnieuw te hoeven compileren of opnieuw te implementeren.

U kunt alle volgende configuratiestappen uitvoeren met behulp van het hulpprogramma Configuration Editor (SvcConfigEditor.exe).

Zie het voorbeeld BasicBinding voor de bronkopie van dit voorbeeld.

Een clientbinding opgeven in de configuratie

  1. Gebruik 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 client die wordt gegenereerd, bevat de ICalculator interface die het servicecontract definieert waaraan de client-implementatie moet voldoen.

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [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);
    }
    
    [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);
    }
    
    
  3. De gegenereerde client bevat ook de implementatie van de ClientCalculator.

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    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);
        }
    }
    
    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;
       }
    }
    
    
  4. Svcutil.exe genereert ook de configuratie voor de client die gebruikmaakt van de BasicHttpBinding-klasse. Wanneer u Visual Studio gebruikt, noemt u dit bestand App.config. Houd er rekening mee dat het adres en de bindingsinformatie nergens binnen de implementatie van de service worden opgegeven. Code hoeft ook niet te worden geschreven om die informatie op te halen uit het configuratiebestand.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
    
        <client>
          <endpoint 
              name=""
              address="http://localhost/servicemodelsamples/service.svc" 
              binding="basicHttpBinding" 
              contract="Microsoft.ServiceModel.Samples.ICalculator" />
        </client>
    
        <bindings>
          <basicHttpBinding/>
        </bindings>
    
      </system.serviceModel>
    
    </configuration>
    
  5. Maak een exemplaar van de ClientCalculator in een toepassing en roep vervolgens de servicebewerkingen aan.

    
    using System;
    using System.ServiceModel;
    
    namespace Microsoft.ServiceModel.Samples
    {
    
        //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({value1},{value2}) = {result}");
    
                // Call the Subtract service operation.
                value1 = 145.00D;
                value2 = 76.54D;
                result = client.Subtract(value1, value2);
                Console.WriteLine($"Subtract({value1},{value2}) = {result}");
    
                // Call the Multiply service operation.
                value1 = 9.00D;
                value2 = 81.25D;
                result = client.Multiply(value1, value2);
                Console.WriteLine($"Multiply({value1},{value2}) = {result}");
    
                // Call the Divide service operation.
                value1 = 22.00D;
                value2 = 7.00D;
                result = client.Divide(value1, value2);
                Console.WriteLine($"Divide({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.

Zie ook