Condividi tramite


Procedura: Ospitare un servizio WCF in WAS

In questo argomento vengono illustrati i passaggi di base necessari per creare un servizio Windows Communication Foundation (WCF) ospitato da Windows Process Activation Services (noto anche come WAS). WAS è il nuovo servizio di attivazione dei processi che è una generalizzazione delle funzionalità di Internet Information Services (IIS) che funzionano con protocolli di trasporto non HTTP. WCF usa l'interfaccia dell'adattatore listener per comunicare le richieste di attivazione ricevute sui protocolli non HTTP supportati da WCF, ad esempio TCP, named pipe e Accodamento messaggi.

Questa opzione di hosting richiede che i componenti di attivazione WAS siano installati e configurati correttamente, ma non richiede la scrittura di codice di hosting come parte dell'applicazione. Per altre informazioni sull'installazione e la configurazione di WAS, vedere Procedura: Installare e configurare i componenti di attivazione WCF.

Avvertimento

L'attivazione WAS non è supportata se la pipeline di elaborazione delle richieste del server Web è impostata sulla modalità classica. La pipeline di elaborazione delle richieste del server Web deve essere impostata su Modalità integrata se deve essere usata l'attivazione WAS.

Quando un servizio WCF è ospitato in WAS, le associazioni standard vengono usate nel modo consueto. Tuttavia, quando si usa NetTcpBinding e NetNamedPipeBinding per configurare un servizio ospitato in WAS, è necessario soddisfare un vincolo. Quando endpoint diversi usano lo stesso trasporto, le impostazioni di associazione devono corrispondere alle sette proprietà seguenti:

  • ConnectionBufferSize

  • TimeoutDiInizializzazioneDelCanale

  • MaxPendingConnections

  • MaxOutputDelay

  • MaxPendingAccepts

  • ConnectionPoolSettings.IdleTimeout

  • ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint

In caso contrario, l'endpoint inizializzato determina sempre i valori di queste proprietà e gli endpoint aggiunti successivamente generano un'eccezione ServiceActivationException se non corrispondono a tali impostazioni.

Per la copia di origine di questo esempio, vedere Attivazione TCP.

Per creare un servizio di base ospitato da WAS

  1. Definire un contratto di servizio per il tipo di servizio.

    [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. Implementare il contratto di servizio in una classe di servizio. Si noti che le informazioni sull'indirizzo o sull'associazione non sono specificate all'interno dell'implementazione del servizio. Inoltre, il codice non deve essere scritto per recuperare tali informazioni dal file di configurazione.

    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. Creare un file Web.config per definire l'associazione NetTcpBinding da utilizzare dagli endpoint CalculatorService.

    <?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. Creare un file Service.svc contenente il codice seguente.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Inserire il file Service.svc nella directory virtuale IIS.

Per creare un client per l'uso del servizio

  1. Usare lo strumento utilità metadati ServiceModel (Svcutil.exe) dalla riga di comando per generare codice dai metadati del servizio.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Il client generato contiene l'interfaccia ICalculator che definisce il contratto di servizio che l'implementazione del client deve soddisfare.

    //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'applicazione client generata contiene anche l'implementazione del ClientCalculator. Si noti che l'indirizzo e le informazioni di associazione non sono specificate in nessun punto all'interno dell'implementazione del servizio. Inoltre, il codice non deve essere scritto per recuperare tali informazioni dal file di configurazione.

    // 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 configurazione per il client che usa il NetTcpBinding è anche generata da Svcutil.exe. Questo file deve essere denominato nel file App.config quando si usa 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. Creare un'istanza di ClientCalculator in un'applicazione e quindi chiamare le operazioni del servizio.

    //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. Compilare ed eseguire il client.

Vedere anche