Tuesday 13 July 2010

BUGS? Só entre a cadeira e o teclado!

Pois é, venho vos falar de um erro que me assombra desde sexta-feira e que passei o fim de semana todo a pensar nele e só hoje é que descobri o que estava a acontecer.

Depois do post anterio, resolvi melhorar o meu código (ahahahah melhorar!!!!) e criar uma separação de responsabilidades em assemblies diferentes. Começei então pelo RIA Service que separei do projecto Web que estava inserido.

Ao fazer isto tudo deixou de funcionar. Passei a ter o seguinte erro:

Operation named 'GetContacts' does not conform to the required signature. Return types must be an entity, collection of entities, or one of the predefined serializable types.


Este erro explica muito pouco o que está a acontecer, mas, depois de lamber muias páginas descobri que não posso ter a seguinte declaração de método:

[Invoke]
public IEnumerable GetContacts(string name) { return null; }

Esta declaração não é possível porque se tiver que retornar uma lista (IEnumerable<>, IList<>, etc), este método necessita ser [Query] e não [Invoke].

Mesmo sabendo que isto já funcionou como o [Invoke] mudei para [Query], mas, ocorria outro erro estranho, o meu código nunca entrava no RIA Service e obtinha sempre um erro a indicar que o servidor indivaca que o método não tinha dito encontrado.

Mais lambidelas de páginas e mais páginas e nada... eis que me recordei que tinha um projecto simples na minha máquina que funcionava. O problema é: FUNCIONA PORQUE?

A razão é simples: Invés de criar o meu RIA Service com Add -> New Item -> Domain Service, estava a criar uma nova class e decorava-a com [EnableClientAccess].
Quando cria-se pelo template são adicionadas referências e um conjuntos de declarações using que eu não estava a fazer e por isso não funcionava.

Infelizmente demorei 4 dias para descobrir este erro simples e espero que vcs não tenham que passar por isso!


Paulo Aboim Pinto

No comments: