Ativação TCP

O exemplo TCPActivation demonstra hospedar um serviço que usa o Windows Process Activation Services (WAS) para ativar um serviço que se comunica pelo protocolo net.tcp. Este exemplo é baseado em Introdução.

Nota

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

O exemplo consiste em um programa de console do cliente (.exe) e uma biblioteca de serviços (.dll) hospedados em um processo de trabalho ativado pelo 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 ICalculator interface, 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;
    }
}

O exemplo usa uma variante da ligação net.tcp com o compartilhamento de porta TCP habilitado e a segurança desativada. Se você quiser usar uma ligação TCP segura, 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.

O exemplo a seguir mostra a configuração para o 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 o exemplo, 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. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

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

    1. No menu Iniciar, escolha Painel de Controle.

    2. Selecione Programas e Recursos.

    3. Clique em Ativar ou desativar componentes do Windows.

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

  3. Configure o WAS para suportar a ativação TCP.

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

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

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

      Gorjeta

      Este comando é uma única linha de texto. Este comando adiciona uma ligação de site net.tcp ao site padrão escutando na porta TCP 808 com qualquer nome de host.

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

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

      Nota

      Este comando é uma única linha de texto. Este comando permite que o aplicativo /servicemodelsamples seja acessado usando e http://localhost/servicemodelsamplesnet.tcp://localhost/servicemodelsamples.

  4. Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

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

    Remova a ligação de site net.tcp adicionada para este exemplo.

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

    1. Remova net.tcp da lista de protocolos habilitados executando o seguinte comando em um prompt de comando de nível de administrador:

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

      Nota

      Este comando deve ser inserido como uma única linha de texto.

    2. Remova a associação de site net.tcp executando o seguinte comando em um prompt de comando de nível de administrador:

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

      Nota

      Este comando deve ser digitado como uma única linha de texto.

Consulte também