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>