Como sabemos, aplicações Silverlight podem recorrer a recursos que rodam no servidor que a hospeda utilizando WCF. Com isso, a aplicação que serve como host para o serviço é uma aplicação ASP.NET tradicional (WebForms ou MVC, Web Site ou Web Application), onde efetivamente criaremos o serviço WCF para que servirá a aplicação Silverlight.
Uma vez com o serviço pronto, tudo o que precisamos fazer para consumir o serviço no Silverlight, é a referência para o mesmo, utilizando a opção Add Service Reference, fornecida pela IDE do Visual Studio .NET. Como é feito em qualquer aplicação cliente, o Visual Studio extrairá as informações do documento WSDL e criará o proxy do lado do cliente, incluindo um arquivo chamado ServiceReferences.ClientConfig, que conterá as configurações de acesso ao serviço referenciado. O código abaixo ilustra esse arquivo:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name=”BasicHttpBinding_IContrato”
maxBufferSize=”2147483647″
maxReceivedMessageSize=”2147483647″>
<security mode=”None” />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address=”http://localhost:1551/ServicoDeTeste.svc”
binding=”basicHttpBinding”
bindingConfiguration=”BasicHttpBinding_IContrato”
contract=”Servico.IContrato”
name=”BasicHttpBinding_IContrato” />
</client>
</system.serviceModel>
</configuration>
Como podemos notar, endereço do serviço WCF está definido de forma absoluta. Isso implica em alguns problemas que podemos ter durante a distribuição/instalação do projeto no servidor. Esse arquivo é comprimido para dentro de um outro arquivo, com extensão *.xap, e que por sua vez, é depositado no diretório ClientBin do projeto ASP.NET que hospeda a aplicação Silverlight. Ao colocar isso no servidor onde ele deverá rodar, provavelmente o endereço do serviço mudará, e ficará complicado e trabalhoso para alterar.
Para melhorar isso, a versão 4.0 do Silverlight permite especificar, de forma relativa, o endereço para o serviço, ou seja, não precisamos mais definir o endereço completo até o arquivo *.svc. Apesar da IDE ainda não ser inteligente o bastante para utilizar esse recurso ao referenciar o serviço, nada nos impede de alterar isso diretamente no arquivo de configuração do lado do cliente, apontando relativamente para o serviço WCF. Para o teste, eu criei um serviço na raiz da aplicação ASP.NET, e como a aplicação Silverlight é colocada na pasta ClientBin desta mesma aplicação, tudo o que precisamos fazer é subir um nível (../). Abaixo podemos visualizar essa ligeira mudança, mas que traz uma grande flexibilidade.
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name=”BasicHttpBinding_IContrato”
maxBufferSize=”2147483647″
maxReceivedMessageSize=”2147483647″>
<security mode=”None” />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address=”../ServicoDeTeste.svc”
binding=”basicHttpBinding”
bindingConfiguration=”BasicHttpBinding_IContrato”
contract=”Servico.IContrato”
name=”BasicHttpBinding_IContrato” />
</client>
</system.serviceModel>
</configuration>
Muito bom seu post, interessante as coisas que você nos mostra e ajuda descobrir o poder da IDE e do framework. Não sei se é interessante para você mais gostaria de deixar a dica para alguns post você poderia mostrar ele funcionando. Mais desde já meus parabéns pelos artigos.
Olá Israel, Parabéns pelo artigo, não sabia que poderia resolver os endereços dos serviços WCF de forma relativa, vou alterar as aplicações atuais e começar a trabalhar com endereços relativos para as proximas, muito melhor.
E ai Israel, blz?
Achei muito interessante, não sabia que era possível fazer isso, muito bom.
Abraços.
Muito bom! Também não sabia que isso era possível.
Um abraço.
Boas Rafael,
Poderia explicar melhor?