A ver si me podéis echar un cable, os cuento:
Por una parte tengo una librería que tiene una interfaz donde se define un método genérico (devuelve un array de tipo List<Object> o List(Of Object) :)). Ésta será la interfaz que definirá el contrato de un servicio de WCF (con sus atributos ServiceContract y OperationContract.)
Por otra parte tengo un conjunto de librerías de que trabajan con diferentes tipos de datos, pero que todas tienen en común que tienen un servicio que implementa la interfaz anterior. Así, dependiendo de la libreria usada, el servicio siempre retornará un array de objetos, pero que en verdad estará rellenado con objetos de un tipo u otro, dependiendo de la libraria usada. Estos objetos que usan tienen sus atributos para que puedan ser serializados (DataContract y DataMember).
Estos servicios tendrán definido su comportamiento (Binding, EndPoint y Contract) en sus respectivos web.config (ya que se servirán desde el IIS) y, como necesitamos decirle al IIS que al generar la metadata (el contrato WSDL) serialize también las clases que tocan (dependiendo de qué libreria sea el servicio), debemos añadir en el web.config las lineas necesarias para el caso.
Buscando por Internet he encontrado que para añadir clases al contrato hay dos formas de hacerlo.
Una de ellas es: si el contrato tiene acceso a estas clases (no es mi caso), añadir a la definicion de la interface tantos atributos ServiceKnownType() como clases queramos añadir (esto funciona). La otra manera, que es la que me puede solucionar el problema: es añadir al web.config las siguientes lineas:
<
system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="System.Object, mscorlib">
<knownType type="ClassLibrary.Persona, ClassLibrary" />
</add>
<add type="System.Object, mscorlib">
<knownType type="ClassLibrary.Tabla, ClassLibrary" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
En este caso le estoy diciendo que me serialize dos clases: una es de tipo ClassLibrary.Persona y la otra de tipo ClassLibrary.Tabla, ambas heredan de la clase básica System.Object. Pero, según el IntelliSense de Visual Studio 2008 Beta 1 <declaredTypes> no existe. Pero weno... estamos en Beta... compilo y me olvido del Intellysense (es lo que dicen por Internet). Pero al intentar acceder al servicio no funciona, se produce un error. En teoría, por lo que he podido averiguar, es por culpa del web.config que está mal formateado (es por las lineas de <declaredTypes>) pero en teoría están bien. Hasta salen en la MSDN Library.
He pensado que lo mio estaba mal y he hecho el ejemplo que da la MSDN Library (copy-paste) y tampoco funciona, el mismo error. grrrrrrr...
Lo que más me molesta es que se trata de una tecnología del Framework 3.0, no del 3.5, así que no debería tener errores ya que se trata de una versión final. :P
¿Sabéis que puede estar pasándome?
O, ¿podéis darme una solución alternativa?. Tener en cuenta que, por razones de arquitectura, ésta no se peude modificar; osea, la librería que contiene el contrato no conoce las librerias que contienen los DataContracts. Aunque eso no debería ser un problema ya que, al final, quien crea el servicio es la librería que tiene la clase que implementa el contrato y está sí que ve las clases que pertenecen al DataContract.
Bueno, a ver si entre todos me echáis un cable.
Espero haberme explicado lo suficientemente bien.
No soy tan malo... almenos sirvo de mal ejemplo.