Procédure : héberger un service WCF dans WASHow to: Host a WCF Service in WAS

Cette rubrique décrit les étapes de base requises pour créer un service de Windows Communication Foundation hébergé (WCF) des services d’activation de processus Windows (également appelé WAS).This topic outlines the basic steps required to create a Windows Process Activation Services (also known as WAS) hosted Windows Communication Foundation (WCF) service. WAS est le nouveau service d’activation de processus généralisant les fonctionnalités des services IIS (Internet Information Services) qui fonctionnent avec des protocoles de transport non-HTTP.WAS is the new process activation service that is a generalization of Internet Information Services (IIS) features that work with non-HTTP transport protocols. WCF utilise l’interface d’adaptateur d’écouteur pour communiquer les demandes d’activation reçues sur les protocoles non-HTTP pris en charge par WCF, tels que TCP, les canaux nommés et les Message Queuing.WCF uses the listener adapter interface to communicate activation requests that are received over the non-HTTP protocols supported by WCF, such as TCP, named pipes, and Message Queuing.

Cette option d'hébergement requiert que les composants d'activation WAS soient installés et configurés correctement, mais ne requiert pas l'écriture du code d'hébergement dans le cadre de l'application.This hosting option requires that WAS activation components are properly installed and configured, but it does not require any hosting code to be written as part of the application. Pour plus d’informations sur l’installation et la configuration de was, consultez Procédure : Installez et configurez lescomposants d’activation WCF.For more information about installing and configuring WAS, see How to: Install and Configure WCF Activation Components.

Avertissement

L’activation de WAS n’est pas prise en charge si le pipeline de traitement de demande du serveur web est en mode classique.WAS activation is not supported if the web server’s request processing pipeline is set to Classic mode. Le pipeline de traitement de demande du serveur Web doit être en mode intégré si l'activation de WAS doit être utilisée.The web server’s request processing pipeline must be set to Integrated mode if WAS activation is to be used.

Lorsqu’un service WCF est hébergé dans WAS, les liaisons standard sont utilisées de la façon habituelle.When a WCF service is hosted in WAS, the standard bindings are used in the usual way. Toutefois, lors de l'utilisation de NetTcpBinding et de NetNamedPipeBinding pour configurer un service hébergé WAS, une contrainte doit être satisfaite.However, when using the NetTcpBinding and the NetNamedPipeBinding to configure a WAS-hosted service, a constraint must be satisfied. Lorsque des points de terminaison différents utilisent le même transport, les paramètres de liaison doivent correspondre dans les sept propriétés suivantes :When different endpoints use the same transport, the binding settings have to match on the following seven properties:

  • ConnectionBufferSizeConnectionBufferSize

  • ChannelInitializationTimeoutChannelInitializationTimeout

  • MaxPendingConnectionsMaxPendingConnections

  • MaxOutputDelayMaxOutputDelay

  • MaxPendingAcceptsMaxPendingAccepts

  • ConnectionPoolSettings.IdleTimeoutConnectionPoolSettings.IdleTimeout

  • ConnectionPoolSettings.MaxOutboundConnectionsPerEndpointConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint

Sinon, le point de terminaison initialisé en premier détermine toujours les valeurs de ces propriétés et les points de terminaison ajoutés ultérieurement lèvent un ServiceActivationException s'ils ne correspondent pas à ces paramètres.Otherwise, the endpoint that is initialized first always determines the values of these properties, and endpoints added later throw a ServiceActivationException if they do not match those settings.

Pour obtenir la copie source de cet exemple, consultez activation TCP.For the source copy of this example, see TCP Activation.

Pour créer un service de base hébergé par WASTo create a basic service hosted by WAS

  1. Définissez un contrat de service pour le type de service.Define a service contract for the type of 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. Implémentez le contrat de service dans une classe de service.Implement the service contract in a service class. Notez que l’adresse ou les informations de liaison ne sont pas spécifiées dans l’implémentation du service.Note that address or binding information is not specified inside the implementation of the service. Par ailleurs, il n'est pas nécessaire d'écrire du code pour récupérer ces informations à partir du fichier de configuration.Also, code does not have to be written to retrieve that information from the configuration file.

    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. Créez un fichier Web.config pour définir la liaison NetTcpBinding à utiliser par les points de terminaison CalculatorService.Create a Web.config file to define the NetTcpBinding binding to be used by the CalculatorService endpoints.

    <?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. Créez un fichier Service.svc contenant le code suivant.Create a Service.svc file that contains the following code.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Placez le fichier Service.svc dans votre rɰertoire virtuel IIS.Place the Service.svc file in your IIS virtual directory.

Pour créer un client qui utilise le serviceTo create a client to use the service

  1. Utilisez l' outil ServiceModel Metadata Utility Tool (Svcutil. exe) à partir de la ligne de commande pour générer le code à partir des métadonnées de service.Use ServiceModel Metadata Utility Tool (Svcutil.exe) from the command line to generate code from service metadata.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Le client généré contient l'interface ICalculator qui définit le contrat de service auquel l'implémentation du client doit satisfaire.The client that is generated contains the ICalculator interface that defines the service contract that the client implementation must satisfy.

    //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. L'application cliente générée contient également l'implémentation de ClientCalculator.The generated client application also contains the implementation of the ClientCalculator. Notez que les informations d’adresse et de liaison ne sont pas spécifiées n’importe où dans l’implémentation du service.Note that the address and binding information is not specified anywhere inside the implementation of the service. Par ailleurs, il n'est pas nécessaire d'écrire du code pour récupérer ces informations à partir du fichier de configuration.Also, code does not have to be written to retrieve that information from the configuration file.

    // 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. La configuration du client qui utilise NetTcpBinding est également générée par Svcutil.exe.The configuration for the client that uses the NetTcpBinding is also generated by Svcutil.exe. Ce fichier doit être nommé dans le fichier App.config lors de l'utilisation de Visual Studio.This file should be named in the App.config file when using Visual Studio.

    
    <?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. Créez une instance ClientCalculator dans une application, puis appelez les opérations de service.Create an instance of the ClientCalculator in an application and then call the service operations.

    //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. Compilez, puis exécutez le client.Compile and run the client.

Voir aussiSee also