Delen via


Procedure: Een WCF-service hosten in WAS

In dit onderwerp vindt u een overzicht van de basisstappen die nodig zijn voor het maken van een Windows Process Activation Services -service (ook wel BEKEND als WAS) gehoste WCF-service (Windows Communication Foundation). WAS is de nieuwe procesactiveringsservice die een generalisatie is van IIS-functies (Internet Information Services) die werken met niet-HTTP-transportprotocollen. WCF gebruikt de interface van de listeneradapter om activeringsaanvragen te communiceren die worden ontvangen via de niet-HTTP-protocollen die worden ondersteund door WCF, zoals TCP, named pipes en Message Queuing.

Deze hostingoptie vereist dat WAS-activeringsonderdelen correct zijn geïnstalleerd en geconfigureerd, maar er hoeft geen hostingcode te worden geschreven als onderdeel van de toepassing. Zie How to: Install and Configure WCF Activation Components (WCF-activeringsonderdelen installeren en configureren) voor meer informatie over het installeren en configureren van WAS.

Waarschuwing

WAS-activering wordt niet ondersteund als de pijplijn voor aanvraagverwerking van de webserver is ingesteld op de klassieke modus. De aanvraagverwerkingspijplijn van de webserver moet worden ingesteld op de geïntegreerde modus als WAS-activering moet worden gebruikt.

Wanneer een WCF-service wordt gehost in WAS, worden de standaardbindingen op de gebruikelijke manier gebruikt. Wanneer u echter de NetTcpBinding en de NetNamedPipeBinding om een door WAS gehoste service te configureren, moet aan een beperking worden voldaan. Wanneer verschillende eindpunten hetzelfde transport gebruiken, moeten de bindingsinstellingen overeenkomen met de volgende zeven eigenschappen:

  • Verbinding maken ionBufferSize

  • ChannelInitializationTimeout

  • MaxPending Verbinding maken ions

  • MaxOutputDelay

  • MaxPendingAccepts

  • Verbinding maken ionPool Instellingen. IdleTimeout

  • Verbinding maken ionPool Instellingen. MaxOutbound Verbinding maken ionsPerEndpoint

Anders bepaalt het eindpunt dat eerst wordt geïnitialiseerd altijd de waarden van deze eigenschappen. Eindpunten die later worden toegevoegd, gooien een ServiceActivationException eindpunt op als ze niet overeenkomen met deze instellingen.

Zie TCP-activering voor de bronkopie van dit voorbeeld.

Een basisservice maken die wordt gehost door WAS

  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 adres- of bindingsinformatie niet is opgegeven binnen de implementatie van de service. Code hoeft ook niet te worden geschreven om die informatie 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 de NetTcpBinding binding te definiëren die door de CalculatorService eindpunten moet worden gebruikt.

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <bindings>  
          <netTcpBinding>  
            <binding portSharingEnabled="true">  
              <security mode="None" />  
            </binding>  
          </netTcpBinding>  
        </bindings>  
      </system.serviceModel>  
    </configuration>  
    
  4. Maak een Service.svc-bestand dat de volgende code bevat.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Plaats het bestand Service.svc in uw virtuele IIS-map.

Een client maken voor het gebruik van de service

  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 client die wordt gegenereerd, 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. Code hoeft ook niet te worden geschreven om die informatie 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. De configuratie voor de client die gebruikmaakt van de NetTcpBinding client wordt ook gegenereerd door Svcutil.exe. Dit bestand moet worden genoemd in het App.config-bestand wanneer u Visual Studio gebruikt.

    
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel> 
            <bindings> 
                <netTcpBinding> 
                    <binding name="NetTcpBinding_ICalculator"> 
                        <security mode="None"/> 
                    </binding> 
                </netTcpBinding> 
            </bindings> 
            <client> 
                <endpoint 
                  address="net.tcp://localhost/servicemodelsamples/service.svc" 
                  binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICalculator" 
                  contract="ICalculator" name="NetTcpBinding_ICalculator" /> 
            </client>
        </system.serviceModel> 
    </configuration>
    
    
  5. Maak een exemplaar van de ClientCalculator in een toepassing en roep vervolgens 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.

Zie ook