Estou tirando a poeira do blog com algumas dicas resultantes de experiências que tive após o contato com o WCF em um projeto real (mais precisamente uma prova de conceito que deve evoluir para um sistema real). Foi um trabalho interessante, que envolvia um sistema amplamente distribuído, onde um requisito importante era justamente a independência de protocolo de comunicação.
Com relação às dicas, ou melhor, lições aprendidas, aí vão elas:
- Ao criar no Visual Studio um projeto que exponha serviços WCF que devam ser hospedados no IIS, utilizar o template Website à WCF Service. Esse template, por tratar-se de um projeto Web, evita problemas tais como criação de strings de conexão no próprio código compilado da aplicação, uma vez que o arquivo Web.config passa a ser usado para armazenar strings de conexão. Além disso, referências para outros serviços WCF também são acrescentadas ao Web.config, sempre que o proxy para algum serviço WCF seja criado/atualizado. Caso seja utilizado um template não-Web, essas referências são acrescentadas ao arquivo app.config, que não é reconhecido pelo IIS.
- Essa é bem útil: sempre que um serviço WCF retornar uma instância de ICollection, esta será representada no proxy para o serviço como um array. Sendo assim, no cliente, esse array deve ser tratado como array, e não como ICollection. Se continuar sendo tratada como ICollection, será gerado um erro de serialização.
- Ao lançar exceções em serviços WCF, não utilizar objetos que herdem de Exception, uma vez que o WCF não é capaz de serializar corretamente esses objetos. Ao invés disso, utilizar classes comuns para encapsular os dados do erro e lançar FaultException<classe do erro>, onde <classe do erro> é a classe criada. O construtor de FaultException recebe como parâmetro uma instância dessa classe. O serviço, por sua vez, deve declarar que lança tal erro através do atributo [FaultContract(typeof(<classe do erro>)]
- Existem situações em que se deseja gerar um proxy dinamicamente para um dado serviço, cujo contrato não é conhecido em tempo de desenvolvimento. Nesse caso, ao invés de usar o svcutil para gerar o proxy, pode-se usar uma ferramenta que a MS desenvolveu para esse cenário: o WCF Dynamic Proxy (http://wcf.netfx3.com/files/folders/development_tools/entry6148.aspx). Avaliei essa ferramenta e ela atende perfeitamente esse requisito, porém com algumas limitações: não é suportada chamada assíncrona ao serviço, e é gerada uma exceção ao invocar operações que recebam como parâmetro um array.
Por enquanto, é isso. Devo continuar me aprofundando em WCF e .NET 3.0 em geral e, qualquer descoberta interessante, vou postando por aqui :)