Como: Hospedar um serviço WCF no WAS

Este tópico descreve as etapas básicas necessárias para criar um serviço Windows Communication Foundation (WCF) hospedado nos Serviços de Ativação de Processos do Windows (também conhecido como WAS). O WAS é o novo serviço de ativação de processo que é uma generalização dos recursos do IIS (Serviços de Informações da Internet) que funcionam com protocolos de transporte não-HTTP. O WCF usa a interface do adaptador de ouvinte para comunicar solicitações de ativação recebidas pelos protocolos não-HTTP suportados pelo WCF, como TCP, pipes nomeados e Enfileiramento de Mensagens.

Esta opção de hospedagem requer que os componentes de ativação do WAS estejam instalados e configurados 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 é suportada se o pipeline de processamento de solicitações do servidor Web estiver definido para o modo Clássico. O pipeline de processamento de solicitações do servidor Web deve ser definido como Modo integrado se a ativação do 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 para configurar um serviço hospedado pelo NetNamedPipeBinding WAS, uma restrição deve ser satisfeita. Quando diferentes pontos de extremidade usam o mesmo transporte, as configurações de vinculação devem corresponder nas seguintes sete propriedades:

  • ConnectionBufferSize

  • ChannelInitializationTimeout

  • MaxPendingConnections

  • MaxOutputDelay

  • MaxPendingAceita

  • 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 lançam um ServiceActivationException se eles não corresponderem a essas configurações.

Para obter a cópia de origem deste exemplo, consulte Ativação 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 o endereço ou as informações de vinculação não são especificados 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 NetTcpBinding associação a ser usada pelos pontos de CalculatorService extremidade.

    <?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 ServiceModel Metadata Utility Tool (Svcutil.exe) na 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 ICalculator interface que define o contrato de serviço que a implementação do cliente deve satisfazer.

    //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 o endereço e as informações de vinculação não são especificados em nenhum lugar 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.

    // 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 por 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 em um aplicativo e, em seguida, chame as operações de ClientCalculator 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.

Consulte também