NamedPipe Activation

A amostra NamedPipeActivation demonstra a hospedagem de um serviço que usa o WAS (Serviço de Ativação de Processo do Windows) para ativar um serviço que se comunica por meio de pipes nomeados. Este exemplo é baseado na Introdução e requer que o Windows Vista seja executado.

Observação

Os procedimentos de instalação e as instruções de compilação para esse exemplo estão localizadas no final deste tópico.

Detalhes de exemplo

O exemplo consiste em um programa de console do cliente (.exe) e uma biblioteca de serviços (.dll) hospedada em um processo de trabalho ativado pelos Serviços de Ativação de Processo do Windows (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);
}

O cliente faz solicitações síncronas para uma determinada operação matemática e 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 associação netNamedPipeBinding modificada sem segurança. A associação é especificada nos arquivos de configuração para o cliente e o serviço. O tipo de associação para o serviço é especificado no atributo binding do elemento de ponto de extremidade, conforme mostrado na configuração de exemplo a seguir.

Se você quiser usar uma associação de pipe nomeada protegida, altere o modo de segurança do servidor para a configuração de segurança desejada e execute svcutil.exe novamente no cliente para obter um arquivo de configuração do cliente atualizado.

<system.serviceModel>
        <services>
            <service name="Microsoft.ServiceModel.Samples.CalculatorService"
               behaviorConfiguration="CalculatorServiceBehavior">

        <!-- This endpoint is exposed at the base address provided by host: net.pipe://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="netNamedPipeBinding"
                  bindingConfiguration="Binding1"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
        <!-- the mex endpoint is exposed at net.pipe://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexNamedPipeBinding"
                  contract="IMetadataExchange" />
      </service>
        </services>
        <bindings>
            <netNamedPipeBinding>
                <binding name="Binding1" >
                    <security mode = "None">
                    </security>
                </binding >
            </netNamedPipeBinding>
        </bindings>

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

  </system.serviceModel>

As informações do ponto de extremidade do cliente são configuradas conforme mostrado no código de exemplo a seguir.

<system.serviceModel>

    <client>
      <endpoint name=""
                          address="net.pipe://localhost/servicemodelsamples/service.svc"
                          binding="netNamedPipeBinding"
                          bindingConfiguration="Binding1"
                          contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>

    <bindings>

      <!--  Following is the expanded configuration section for a NetNamedPipeBinding.
            Each property is configured with the default value. -->

      <netNamedPipeBinding>
        <binding name="Binding1"
                         maxBufferSize="65536"
                         maxConnections="10">
          <security mode = "None">
          </security>
        </binding >

      </netNamedPipeBinding>
    </bindings>

  </system.serviceModel>

Ao executar 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 o Procedimento de configuração único para amostras do 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ó Microsoft .NET Framework 3.0 e marque o recurso de Ativação não HTTP do Windows Communication Foundation.

  3. Configure o WAS (Serviço de Ativação de Processo do Windows) para permitir a ativação de pipe nomeado.

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

    1. Para permitir ativação do net.pipe, o site padrão precisa primeiro ser associado ao protocolo net.pipe. Isso pode ser feito usando o appcmd.exe instalado com o conjunto de ferramentas de gerenciamento do IIS 7.0. Em um prompt de comando com privilégios elevados (administrador), execute o comando a seguir.

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

      Observação

      Esse comando é uma única linha de texto.

      Esse comando adiciona uma associação de site net.pipe ao site padrão.

    2. Embora todos os aplicativos em um site compartilhem uma associação net.pipe em comum, cada aplicativo pode habilitar o suporte ao net.pipe individualmente. Para habilitar net.pipe para o aplicativo /servicemodelsamples, execute o comando a seguir em um prompt de comando com privilégios elevados.

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

      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 descritas em Como compilar as amostras do Windows Communication Foundation.

  5. Remova a associação de site net.pipe adicionada para este exemplo.

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

    1. Para remover o net.tcp da lista de protocolos habilitados, execute o comando a seguir de um prompt de comando com privilégios elevados.

      %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 com privilégios elevados.

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

      Observação

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

Confira também