Ativação TCP

A amostra TCPActivation demonstra a hospedagem de um serviço que usa o WAS (Serviços de Ativação de Processo do Windows) para ativar um serviço que se comunica pelo protocolo net.tcp. Esta amostra é baseada na Introdução.

Observação

O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.

A amostra consiste em um programa de console do cliente (.exe) e uma biblioteca de serviços (.dll) hospedada em um processo de trabalho ativado pelos WAS. A atividade do cliente é visível na janela do console.

O serviço implementa um contrato que define um padrão de comunicação solicitação-resposta. O contrato é definido pela interface ICalculator, que expõe operações matemáticas (adicionar, subtrair, multiplicar e dividir), conforme mostrado no código de exemplo a seguir:

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
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);
}

A implementação do serviço calcula e retorna o resultado apropriado:

// Service class that implements the service contract.
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;
    }
}

A amostra usa uma variante da associação net.tcp com o compartilhamento de porta TCP habilitado e a segurança desativada. Se você quiser usar uma associação TCP protegida, altere o modo de segurança do servidor para a configuração desejada e execute novamente Svcutil.exe no cliente para gerar um arquivo de configuração do cliente de atualização.

A amostra a seguir mostra a configuração do serviço:

<system.serviceModel>

    <services>
      <service name="Microsoft.ServiceModel.Samples.CalculatorService"
               behaviorConfiguration="CalculatorServiceBehavior">
        <!-- This endpoint is exposed at the base address provided by host: net.tcp://localhost/servicemodelsamples/service.svc  -->
        <endpoint binding="netTcpBinding" bindingConfiguration="PortSharingBinding"
          contract="Microsoft.ServiceModel.Samples.ICalculator" />
        <!-- the mex endpoint is exposed at net.tcp://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="PortSharingBinding" portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>

    <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>

O ponto de extremidade do cliente é configurado conforme mostrado no código de exemplo a seguir:

<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="Microsoft.ServiceModel.Samples.ICalculator" name="NetTcpBinding_ICalculator" />
    </client>
</system.serviceModel>

Quando você executa a amostra, as solicitações de operação e as respostas são exibidas na janela do console do cliente. Pressione ENTER na janela do cliente para desligar o cliente.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Para configurar, compilar, e executar o exemplo

  1. Verifique se o IIS 7.0 está instalado. O IIS 7.0 é necessário para a ativação do WAS.

  2. Verifique se você executou as Amostras de Procedimento de Instalação Única para o Windows Communication Foundation.

    Além disso, você precisa instalar os componentes de ativação não HTTP do WCF:

    1. No menu Iniciar, selecione Painel de Controle.

    2. Selecione Programas e Recursos.

    3. Clique em Ativar ou desativar componentes do Windows.

    4. Expanda o nó do Microsoft .NET Framework 3.0 e marque o recurso de Ativação não HTTP do Windows Communication Foundation.

  3. Configure o WAS para dar suporte à ativação TCP.

    Como conveniência, as duas etapas a seguir são implementadas em um arquivo em lote chamado AddNetTcpSiteBinding.cmd localizado no diretório de amostra.

    1. Para dar suporte à ativação net.tcp, o site padrão deve primeiro ser associado a uma porta net.tcp. Isso pode ser feito usando Appcmd.exe, que é instalado com o conjunto de ferramentas de gerenciamento do IIS 7.0 (Serviços de Informações da Internet). Em um prompt de comando no nível do administrador, execute o seguinte comando:

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.tcp',bindingInformation='808:*']
      

      Dica

      Esse comando tem apenas uma única linha de texto. Esse comando adiciona uma associação de site net.tcp ao site padrão escutando na porta TCP 808 com qualquer nome de host.

    2. Embora todos os aplicativos em um site compartilhem uma associação net.tcp em comum, cada aplicativo pode habilitar individualmente o suporte ao net.tcp. Para habilitar net.tcp para o aplicativo /servicemodelsamples, execute o comando a seguir em um prompt de comando no nível do administrador:

      %windir%\system32\inetsrv\appcmd.exe set app
      "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.tcp
      

      Observação

      Esse comando tem apenas uma única linha de texto. Esse comando permite que o aplicativo /servicemodelsamples seja acessado usando http://localhost/servicemodelsamples e net.tcp://localhost/servicemodelsamples.

  4. Para compilar a edição C# ou do Visual Basic .NET da solução, siga as instruções em Como compilar as amostras do Windows Communication Foundation.

  5. Para executar o exemplo em uma configuração de computador único ou entre computadores, siga as instruções em Como executar as amostras do Windows Communication Foundation.

    Remova a associação do site net.tcp adicionada por esta amostra.

    Como conveniência, as duas etapas a seguir são implementadas em um arquivo em lote chamado RemoveNetTcpSiteBinding.cmd localizado no diretório de exemplo.

    1. Remova net.tcp da lista de protocolos habilitados executando o comando a seguir de um prompt de comando no nível do administrador:

      %windir%\system32\inetsrv\appcmd.exe set app
      "Default Web Site/servicemodelsamples" /enabledProtocols:http
      

      Observação

      Esse comando precisa ser inserido como uma única linha de texto.

    2. Para remover a associação de site do net.tcp, execute o comando a seguir de um prompt de comando no nível do administrador:

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site"
      --bindings.[protocol='net.tcp',bindingInformation='808:*']
      

      Observação

      Esse comando precisa ser digitado como uma única linha de texto.

Confira também