declaredTypes ?, da error al intentar compilar. - DotNetClubs
en

DotNetClubs

Comunidades de estudiantes entusiastas de la tecnología

declaredTypes ?, da error al intentar compilar.

Último artículo 08-13-2007 22:23 escrito por napilut. 2 respuestas.
Página 1 de 1 (3 elementos)
Ordenar mensajes: Anterior Siguiente
  • 08-13-2007 15:55

    • napilut
    • Contribuyente Top 50
    • Se unió el 10-31-2006
    • Sant Cugat, Barcelona
    • Envíos: 14
    • Puntos: 0
    • DotNetClub_Coordinadores
      DotNetClub_Miembros

    declaredTypes ?, da error al intentar compilar.

    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.
    • Puntos de post: 0
  • 08-13-2007 20:43 en respuesta a

    • penyaskito
    • Contribuyente Top 25
    • Se unió el 08-17-2006
    • Sevilla
    • Envíos: 61
    • Puntos: 115
    • DotNetClub_Miembros

    Re: declaredTypes ?, da error al intentar compilar.




    Hola, reenvié este mensaje a Marcos Cobeña,
    y esto es lo que me respondió:



    &nbsp;



    Hola Christian:



    &nbsp;



    Esto creo que no está del todo bien:



    &quot;



    &gt;
    style='mso-spacerun:yes'>         
    &lt;add type=&quot;System.Object,
    mscorlib&quot;&gt;



    &gt;
    style='mso-spacerun:yes'>            
    &lt;knownType
    type=&quot;ClassLibrary.Persona, ClassLibrary&quot; /&gt;



    &gt;          &lt;/
    class=SpellE>add
    &gt;



    &quot;



    &nbsp;



    Persona no forma parte de ningún namespace
    de .NET, ni es un tipo



    Object de por sí. Debería usar
    algo similar a:



    &quot;



    &lt;add
    type=&quot;Geeks.PolyService.Person, Geeks.PolyService&quot;&gt;



    &lt;knownType
    type=&quot;Geeks.PolyService.Employee,Geeks.PolyService&quot; /&gt;



    &lt;/add&gt;



    &quot;



    &nbsp;



    Más información sobre servicios polimórficos:



    http://geeks.ms/blogs/aruiz/archive/2006/10/31/Servicios-polim_F300_rficos-en-WCF.aspx.



    &nbsp;



    Un saludo,



    El 13/08/07, Christian López Espínola



    escribió:



    &gt; Esta es pa ti, a ver si le
    das solucion :)



    &gt;&nbsp;




    Christian López Espínola
    http://penyaskitodice.wordpress.com
    penyaskito AT sevilla.dotnetclubs.com
    • Puntos de post: 0
  • 08-13-2007 22:23 en respuesta a

    • napilut
    • Contribuyente Top 50
    • Se unió el 10-31-2006
    • Sant Cugat, Barcelona
    • Envíos: 14
    • Puntos: 0
    • DotNetClub_Coordinadores
      DotNetClub_Miembros

    Re: declaredTypes ?, da error al intentar compilar.

    Ya encontré este blog cuando busqué por internet.

    El caso es que en ese ejemplo la interface usaba la clase Person. En los DataContracts había una clase Employee que heredaba de Person, pero como no la usaba directamente la interface no se serializaba y no salía en el contrato y por eso hace uso de <declaredTypes>. Mi caso, es parecido pero no del todo igual.

    El tema es que en mi caso la interface no usa ningún tipo más que Object (el método acepta un parámetro y devuelve un List(Of Object) (lo estoy progrmando en VB.NET pero en C# pasa lo mismo), y yo necesito que se serialize también tanto Persona como Tabla. Las dos pertenecen al espacio de nombres ClassLibrary que no es más que una dll con estas dos clases. Per eso, imitando el ejemplo de ese post, yo puse la clase base (Object en mi caso), donde estaba la clase Person, y la clase que hereda de Object (Persona en mi caso - ya que todas las clases heredan de ésta) donde estaba la clase Employee que heredaba de Person.

    Lo pero de todo no es que este mal esto en si, si no que TB prové ese ejemplo, y me siguía dando erro al "intentar" generar la metadata a partir del web.config por culpa de que no reconoce los campos <declaredTypes>, es como si no existieran dentro de <dataContractSerializer> que si que existe dentro de <system.runtime.serialization>. Por eso me da rábia. Si fuera culpa de la definiciónde tipos, ya me montaría algo del palo crear una clse base vacia y que persona y tabla hereden de ella. Pero como el error esta en que no reconoce <declaredTypes> no se como solucionarlo.

    No soy tan malo... almenos sirvo de mal ejemplo.
    • Puntos de post: 0
Página 1 de 1 (3 elementos)
(c) DotNetClubs 2008
Ofrecido por Community Server (Commercial Edition)