Hospedando serviços WCF no IIS via NetTcp e Windows Process Activation

Para que um serviço seja consumido via NetTcp no IIS, uma série de passos devem ser tomados. E o objetivo deste post é demonstrar como essa configuração pode ser feita.

Por que utilizar NetTcp? Este é o modelo de binding mais eficiente, este modelo é baseado no padrão TCP (Transmission Control Protocol). É bastante utilizado na comunicação entre serviços e dentro de ambientes de intranet. Este modelo de binding é indicado quando queremos fazer uso de um tráfego seguro e confiável.

Por que utilizar o NetTcp no IIS? Por diversas maneiras: (1) se um serviço exposto em um Windows Service tiver um estouro de exceção, então o serviço torna-se offline; (2) serviços expostos em consoles não são confiáveis, robustos e executam no contexto do usuário logado no Windows; (3) IIS é o serviço mais confiável, possui recursos de starting automático e recycling, além de possuir diversos recursos de monitoramento.
Para configurarmos um serviço WCF no IIS precisamos seguir os seguintes passos:

1 – Validação de recursos no Windows.

Verifique se o recurso “Windows Communication Foundation Non-HTTP Activation” está instalado.

clip_image002

2 – Verificação de serviços do Windows.

Verifique se os serviços “Windows Process Activation Service” e “Net.Tcp Port Sharing Service” estão executando no Windows.

3 – Criação do projeto de serviço WCF.

Execute o Visual Studio como “administrador do sistema” e crie o projeto WCF que será publicado no IIS. Para este exemplo, criei uma estrutura muito pequena para demonstração. A estrutura segue abaixo:

using System.ServiceModel;

namespace BlogService {

    [ServiceContract]
    public interface IBlog {

        [OperationContract]
        string ExecuteOperation();
    }
}
using System;

namespace BlogService {

    public class Blog : IBlog  {

        public string ExecuteOperation() {

            return "Service is running";
        }
    }
}

4 – Configuração do arquivo Web.Config.

A estrutura do arquivo Web.Config é bastante simples, ela contém:

– Um ServiceBehavior;

– Um serviço expondo dois EndPoints (netTcpBinding e mexTcpBinding);

– Uma configuração do NetTcpBinding;

Acredito que o ponto de destaque deste Web.Config é a configuração da propriedade PortSharingEnabled. Esta propriedade indica que o compartilhamento da porta TCP está habilitada para conexões. A configuração dessa propriedade para TRUE é vital para que o serviço seja exposto no IIS.

O arquivo Web.Config ficou definido da seguinte maneira:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="BlogService.Blog">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="netTcpConfig" contract="BlogService.IBlog"/>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpConfig" portSharingEnabled="true">
        </binding>
      </netTcpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>

5 – Configuração do modo de execução do serviço.

Configure o serviço para executar no IIS local. Para tanto, clique com o botão direito sobre o projeto do serviço, clique em “Propriedades” e vá até a aba “Web”. Na aba “Web”, dentro da seção “Servers”, selecione “Local IIS” e clique em “Create Virtual Directory”.

clip_image004

6 – Habilitando protocolos no diretório virtual.

Depois de criado o diretório virtual execute a aplicação, você verá a seguinte mensagem de erro: “Could not find a base address that matches scheme net.tcp for the endpoint with binding NetTcpBinding. Registered base address schemes are [http].”.

clip_image006

Essa mensagem de erro nos informa que o protocolo NetTcp não está configurado no diretório virtual. Desta forma, faremos alguma configurações no diretório virtual e no application criado no passo anterior. Abra o IIS, clique sobre “Default Web Site” e clique no link “Bindings” ao lado direito. Será aberta uma janela com todos os bindings registrados para este web site. Se não existir um binding para “net.tcp” então crie-o com o “binding information” igual a “808:*”.

clip_image008

Depois disso, abra o application criado pelo Visual Studio, ele está localizado dentro de “Default Web Site”. Clique em “Advanced Settings” e edite o valor da propriedade “Enabled Protocols”, adicionando o net.tcp entre os protocolos habilitados.

clip_image010

Execute o serviço novamente, agora ele está pronto para ser consumido via NetTcp.

7 – Teste da aplicação.

Abra o WCF Test Client (WcfTestClient.exe) e acesse o serviço exposto no caminho “net.tcp://localhost/<suaaplicacao>/<seuservico>.svc/mex”. O serviço exposto no meu exemplo possui o seguinte endereço: “net.tcp://localhost/BlogService/Blog.svc/mex”.

clip_image012

Após este mapeamento via WcfTestClient.exe é possível realizar chamadas para o serviço expostos.

Espero que este post seja útil.

FH

Referências:

http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.portsharingenabled(v=vs.110).aspx

http://blogs.msdn.com/b/prathul/archive/2011/11/28/hosting-wcf-nettcp-on-iis-was.aspx

http://msdn.microsoft.com/en-us/library/bb552364(v=vs.110).aspx

Publicidade

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.