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.
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”.
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].”.
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:*”.
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.
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”.
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://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