quarta-feira, setembro 11, 2013

WCF utilizando nome da máquina nos serviços ao invés do domínio da aplicação

Uma das coisas que eu mais sinto falta no universo .Net é a falta de um bom servidor de aplicação.
Um cara como o GlassFish, JBoss, etc. a quem eu possa deixar a cargo toda a responsabilidade de criar e gerenciar pool de conexões, envio de e-mails, etc. e também hospedar as minhas aplicações do tipo webservice.
Estou usando o IIS (Internet Information Services) para tal tarefa e não estou gostando nada disso. Mas enfim, o post é sobre outro assunto ;)

Estava eu criando um serviço utilizando o WCF (Windows Communication Foundation) e o hospedando em um site chamado wcf rodando no IIS em um servidore de desenvolvimento. O deploy foi tranqüilo e quando acessei pelo browser o endereço http://192.xxx.xx.xxx:8081/wcf vi lá listado o meu serviço.

Tudo parecia bem, estranhamente bem, pois nada com a Microsoft é de primeira (ao menos comigo). E Murphy não me abandonou! Quando eu acessei o link do serviço vi que o mesmo estava referenciando o nome da máquina, Anita, na url para o arquivo XML do descritor do serviço (wsdl) e em todos os links dentro dele também está escrito o nome da máquina e não um IP ou o nome do domínio.

Embedded ImageUtil

Ok. Lá vamos nós procurar no MSDN a sintaxe da configuração do arquivo App.config. Para quem já utilizou os docs da linguagem Java da Sun/Oracle, a MSDN é de chorar.

Encontrei algumas soluções na internet, alterando arquivos de configuração do IIS, etc. até que achei a solução, colocar <behaviors><serviceBehaviors><behavior> a tag <useRequestHeadersForMetadataAddress>, que está descrito na MSDN como: Enables the retrieval of metadata address information from the request message headers. Ou seja, trocando em miúdos, pegar do header das requisições a informação do endereço.
E voilà!

Embedded ImageUtil

Todos os links dentro do descritor agora estão corretos também.
Para que fique registrada a dica, aqui está a configuração feita no App.config para o exemplo dessa postagem:

<?xml version="1." encoding="utf-8" ?>
<configuration>
   
  <system.web>
    <compilation debug="true" />
  </system.web>
   
  <system.serviceModel>
    <services>
      <service name="com.blogspot.jeanjmichel.services.GetGreetingService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8081/wcf" />
          </baseAddresses>
        </host>
         
        <endpoint address =""
                  binding="basicHttpBinding"
                  contract="com.blogspot.jeanjmichel.services.contract.IGetGreeting"
                  bindingNamespace="http://jeanjmichel.blogspot.com/services/v1.0.0" >
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
         
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
     
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <useRequestHeadersForMetadataAddress>
            <defaultPorts>
              <add scheme="http" port="8081" />
            </defaultPorts>
          </useRequestHeadersForMetadataAddress>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
     
  </system.serviceModel>
</configuration>

Um comentário:

Unknown disse...

muito obrigado kra, salvou minha vida *.*