Compartilhar via


Como: hospedar um serviço WCF no WAS

Este tópico descreve as etapas básicas necessárias para criar um serviço do Windows Process Activation Services (também conhecido como WAS) hospedado pelo WCF (Windows Communication Foundation). O WAS é o novo serviço de ativação de processos que é uma generalização dos recursos do IIS (Internet Information Services) que funcionam com protocolos de transporte não HTTP. O WCF usa a interface do adaptador do ouvinte para comunicar solicitações de ativação recebidas por protocolos não HTTP compatíveis com o WCF, como TCP, pipes nomeados e Enfileiramento de Mensagens.

Essa opção de hospedando requer que os componentes de ativação do WAS estejam configurados e instalados corretamente, mas não requer que nenhum código de hospedagem seja escrito como parte do aplicativo. Para obter mais informações sobre como instalar e configurar o WAS, consulte Como instalar e configurar componentes de ativação do WCF.

Aviso

A ativação do WAS não tem suporte se o pipeline de processamento de solicitação do servidor Web estiver definido como modo Clássico. O pipeline de processamento de solicitação do servidor Web deve ser definido como modo Integrado se a ativação WAS for usada.

Quando um serviço WCF é hospedado no WAS, as associações padrão são usadas da maneira usual. No entanto, ao usar o NetTcpBinding e o NetNamedPipeBinding para configurar um serviço hospedado pelo WAS, uma restrição deve ser atendida. Quando pontos de extremidade diferentes usam o mesmo transporte, as configurações de associação precisam corresponder às sete propriedades a seguir:

  • ConnectionBufferSize

  • ChannelInitializationTimeout

  • MaxPendingConnections

  • MaxOutputDelay

  • MaxPendingAccepts

  • ConnectionPoolSettings.IdleTimeout

  • ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint

Caso contrário, o ponto de extremidade inicializado primeiro sempre determina os valores dessas propriedades e os pontos de extremidade adicionados posteriormente geram um ServiceActivationException caso não correspondam a essas configurações.

Para obter a cópia da origem deste exemplo, consulte Ativação de TCP.

Para criar um serviço básico hospedado pelo WAS

  1. Defina um contrato de serviço para o tipo de serviço.

    [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. Implemente o contrato de serviço em uma classe de serviço. Observe que as informações de endereço ou associação não são especificadas dentro da implementação do serviço. Além disso, o código não precisa ser gravado para recuperar essas informações do arquivo de configuração.

    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. Crie um arquivo Web.config para definir a associação NetTcpBinding a ser usada pelos pontos de extremidade 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. Crie um arquivo Service.svc que contenha o código a seguir.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Coloque o arquivo Service.svc no diretório virtual do IIS.

Para criar um cliente para usar o serviço

  1. Use a Ferramenta do Utilitário de Metadados do ServiceModel (Svcutil.exe) da linha de comando para gerar código a partir de metadados de serviço.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. O cliente gerado contém a interface ICalculator que define o contrato de serviço que a implementação do cliente deve atender.

    //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. O aplicativo cliente gerado também contém a implementação do ClientCalculator. Observe que as informações de endereço e associação não são especificadas em nenhum lugar na implementação do serviço. Além disso, o código não precisa ser gravado para recuperar essas informações do arquivo de configuração.

    // 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. A configuração para o cliente que usa o NetTcpBinding também é gerada pelo Svcutil.exe. Esse arquivo deve ser nomeado no arquivo App.config ao usar o 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. Crie uma instância do ClientCalculator em um aplicativo e, em seguida, chame as operações de serviço.

    //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. Compile e execute o cliente.

Confira também