Thursday, March 30, 2017
   

Latest Posts

Posted on 7/28/2016 by André Pires in Reflexões
Posted on 1/10/2014 by André Pires in .Net
Posted on 1/7/2014 by André Pires

Posts

Como configurar um serviço WCF com múltiplos endpoints

Posted on 8/11/2012 by André Pires in WCF .Net
image

Boa noite! Hoje durante a aula de WCF, dei uma "travada" na hora de configurar um serviço WCF com múltiplos endpoints. Especificamente, eu quis demonstrar um serviço funcionando com dois endpoints com diferentes esquemas de protocolo: Um com o basicHttpBinding e outro com o netTcpBinding. Tudo corria muito bem até que eu cheguei na configuração do net.tcp e lá fiquei... Uma bela travada! Olha, vida de instrutor é f.!

O pior é que eu sabia que se tratava de algum detalhe que deixei escapar na configuração do serviço mas que não lembrava e não conseguia enxergar... Klass me zuando, Daniela me olhando, etc, sucumbi à pressão e desisti. Afinal, já tinha dado a hora e o pessoal queria ir pra casa... E eu também!

Como bom brasileiro, eu não desisto nunca! Cheguei em casa depois de uma boa pedalada, tomei um belo banho, comi o jantar delicioso de minha amada e voltei à luta!

Não é que eu tinha razão? Tratava-se de um detalhe ridículo de tão simples, mas muito importante, que o mané aqui se esqueceu...

Eis o problema: Meu ServiceBehavior.

Ao configurar o serviço, eu acrescentei a seguinte código ao meu config:

<behaviors>
  <serviceBehaviors>
    <behavior name="MEX">
      <serviceMetadata httpGetEnabled="true" httpGetUrl="mex" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Note o elemento <behavior name="MEX">. Eu acrescentei o atributo 'name' e atribuí o valor 'MEX'. Ao fazer isso, eu sobrescrevi o behavior padrão de meu serviço e, ao testar o mesmo, eu recebi o seguinte erro:

The contract name 'IMetadataExchange' could not be found in the list of contracts implemented by the service TextServices.  Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost directly to enable support for this contract.

O que me chateia nessa mensagem de erro é que ela diz qual é o problema, mas não deixa claro o que fazer para solucionar. Aliando isso ao fato de que eu havia acrescentado o serviceBehavior e até nomeado o danado, eu sabia que não se tratava da falta do mesmo!

Tudo o que eu precisava fazer era incluir o atributo 'behaviorConfiguration' no elemento 'service', como no código abaixo:

...
<system.serviceModel>
    <services>
      <service name="TurmaDeSabado.Modulo5.ServiceLib.TextServices" behaviorConfiguration="MEX">
...

Note o atributo configurado corretamente na terceira linha... Era isso que faltava! Droga!

Um dia eu aprendo! :)

Outras lições tiradas desse exemplo:

Depois de a travada estar estabelecida e eu não ter conseguido visualizar o problema, tentei uma série de outras combinações desastrosas, mesmo sabendo que muitas delas não faziam sentido algum! Aqui estão:

1) O Visual Studio utiliza o IIS Express como servidor web para o desenvolvedor. Ele é uma versão 'lightweight' do IIS e, consequentemente, limitado! No exemplo que eu queria passar, que utilizaria o net.tcp, não seria possível testar com sucesso o serviço simplesmente executando a aplicação no Visual Studio... O IIS Express não dá suporte aos famosos protocolos NON-HTTP, e isso obviamente inclui o net.tcp. Resumindo, não adianta configurar esses procolos no IIS Full e querer que isso funcione no IIS Express, ok?

Como fica isso em código? Assim:

01.<service name="TurmaDeSabado.Modulo5.ServiceLib.TextServices" behaviorConfiguration="MEX">
02.     
03.    <endpoint address=""
04.              binding="basicHttpBinding"
05.              name="basic"
06.              contract="TurmaDeSabado.Modulo5.ServiceLib.ITextServices" />
07.     
08.    <endpoint address=""
09.              binding="netTcpBinding"
10.              bindingConfiguration=""
11.              name="net"
12.              contract="TurmaDeSabado.Modulo5.ServiceLib.ITextServices" />
13.     
14.    <endpoint address="mex"
15.              binding="mexTcpBinding"
16.              bindingConfiguration=""
17.              name="mex"
18.              contract="IMetadataExchange" />
19.     
20.    <host>
21.      <baseAddresses>
22.        <add baseAddress="net.tcp://localhost:909/TextServices" />
23.        <add baseAddress="http://localhost/TextServices" />
24.      </baseAddresses>
25.    </host>
26.</service>

No código acima você pode observar que estou configurando 3 endpoints, sendo um do tipo basicHttpBinding na linha 3, outro netTcpBinding na linha 8 e outro do tipo mexTcpBinding na linha 14. Esse trem não funciona nem a pau no IIS Express, pois o IIS Express não suporta os endpoints que não sejam do esquema HTTP! Aprendeu? ;)

Eis o erro que você receberá se tentar executar essa configuração no IIS Express:

Could not find a base address that matches scheme net.tcp for the endpoint with binding NetTcpBinding. Registered base address schemes are [http]

Se você publicar o serviço no IIS Full com as mesmas configurações, vai rodar que é uma beleza!

Outras lições:

Note que eu não configurei o endpoint de metadados para o binding basicHttp. Mesmo assim é possível obter o WSDL do serviço quando executamos o mesmo, seja no IIS Express ou no Full. Isso se dá pelo fato de que na minha configuração do Service Behavior (primeiro trecho de código acima) eu habilitei o elemento serviceMetadata e utilizei dois atributos: O httpGetEnabled e o httpGetUrl. O primeiro eu passei para 'true' e o segundo eu passei para 'mex', como podem ver, mas o que importa mesmo é o segundo, como o valor mex. Ao utilizar este atributo, eu não preciso (e nem posso) configurar um endpoint de MEX para protocolo http. Ou seja, eu uso um dos dois modos de acordo com o que eu achar mais apropriado...

Enfim... Agora está tudo funcionando muito bem aqui. O perrengue passou, a raiva também e está tudo certo! :)

Na próxima aula, vou continuar com o assunto do curso e mostrar mais lições importantes pro pessoal.

Um grande abraço e até a próxima travada! :)

Home   |   Forum
André Pires 2011