none
WCF - DataContractSerializer: Como indicar que un miembro del contrato es una secuencia. RRS feed

  • Pregunta

  • Hola,

    tengo un problema al especificar un contrato. Cuándo creo el mismo, necesito que un miembro pueda repetirse un número de veces variable, es decir, que sea una secuencia. Para establecer la estructura en .Net es fácil, simplemente indico que un <datamember> sea una lista del tipo que yo quiero y consigo tener mi secuencia.

    El problema viene cuándo he importado el servicio WCF que tiene el contrato como parámetro de entrada de un método para ser consumido desde Biztalk Server 2010, cuándo importa el contrato no reconoce que "List(Of .." se corresponda con una secuencia. ¿Alguién sabe si se necesita indicar algo en la declaración? simplemente uso:

     

     

     <Serializable()> _
     <DataContract(Name:="Informacion")> _
     Public Class Informacion
      Sub New(ByVal value As Empleado)
       Me._empleados = New List(Of Empleado)
       Me._empleados.Add(value)
      End Sub
      Sub New()
       Me._empleados = New List(Of Empleado)
      End Sub
    
      Private _empleados As List(Of Empleado)
    
      <DataMember(Name:="Empleados")> _
      Public Property empleados() As List(Of Empleado)
       Get
        Return Me._empleados
       End Get
       Set(ByVal value As List(Of Empleado))
        Me._empleados = value
       End Set
      End Property
      Public Sub AddEmpleado(ByVal value As Empleado)
       Me._empleados.Add(value)
      End Sub
     End Class
    

     

     

    Necesitaría que se reconociera al DataMember "Empleados" como una secuencia que contiene elementos del tipo "empleado". El problema es que la importación de Biztalk Server 2010 lo extrapola como un XML que tiene un TAG empleados que dentro tiene otro TAG empleado, no una secuencia de elementos del tipo empleado.

    Gracias.


    Regards, Pablo Martín Gutierrez.
    martes, 31 de mayo de 2011 7:51

Todas las respuestas

  • Hola,

     Parece un problema de compatibilidad, List Of T no es un tipo nativo de SOAP, podés probar con un simple Array Empleado[] y ver qué pasa, debería funcionar

    martes, 31 de mayo de 2011 12:27
  • Hola, 

    he cambiado el DataContract, ahora es así:

      <Serializable()> _
    <DataContract(Name:="WS_Notificacion_Salida", Namespace:="http://Schemas.Rupx.WebService.com/")> _
      Public Class WS_Notificacion_Salida
        Private _id As String
        Private _Empleados() As EmpleadoProcesado
    
        Sub New(ByVal value() As EmpleadoProcesado, ByVal count As UInteger)
          ReDim Me._Empleados(count)
          Me._Empleados = value
        End Sub
    
        <DataMember(Name:="Empleados")> _
        Public Property EmpleadoProcesado() As EmpleadoProcesado()
          Get
            Return Me._Empleados
          End Get
          Set(ByVal value As EmpleadoProcesado())
            Me._Empleados = value
          End Set
        End Property
        <DataMember(Name:="ID")> _
        Public Property Id() As String
          Get
            Return Me._id
          End Get
          Set(ByVal value As String)
            Me._id = value
          End Set
        End Property
      End Class
    

    Al volver a importar el servico en Biztalk, me genera los esquemas de distinta forma que antes.

    Genera como "Modificacion_BasicaResponse" a la llamada el siguiente esquema:

     <xs:element name="Modificacion_BasicaResponse">
     <xs:complexType>
     <xs:sequence>
     <xs:element minOccurs="0" name="Modificacion_BasicaResult" nillable="true" type="tns:WS_Notificacion_Salida" /> 
     </xs:sequence>
     </xs:complexType>
     </xs:element>
    

    Dónde "Modificacion_BasicaResult" es:

    <xs:element minOccurs="0" name="Modificacion_BasicaResult" nillable="true" type="tns:WS_Notificacion_Salida" /> 

    Dónde WS_Notificacon_Salida tiene:

    <xs:complexType name="WS_Notificacion_Salida">
     <xs:sequence>
     <xs:element minOccurs="0" name="Empleados" nillable="true" type="tns:ArrayOfEmpleado" /> 
     <xs:element minOccurs="0" name="ID" nillable="true" type="xs:string" /> 
     </xs:sequence>
     </xs:complexType>
     <xs:element name="WS_Notificacion_Salida" nillable="true" type="tns:WS_Notificacion_Salida" /> 
     <xs:complexType name="ArrayOfEmpleado">
     <xs:sequence>
     <xs:element minOccurs="0" maxOccurs="unbounded" name="Empleado" nillable="true" type="tns:Empleado" /> 
     </xs:sequence>
     </xs:complexType>
     <xs:element name="ArrayOfEmpleado" nillable="true" type="tns:ArrayOfEmpleado" /> 
     <xs:complexType name="Empleado">
     <xs:sequence>
     <xs:element minOccurs="0" name="Error" nillable="true" type="xs:string" /> 
     <xs:element minOccurs="0" name="Nif" nillable="true" type="xs:string" /> 
     <xs:element minOccurs="0" name="Resultado" nillable="true" type="xs:string" /> 
     </xs:sequence>
     </xs:complexType>
     <xs:element name="Empleado" nillable="true" type="tns:Empleado" /> 
    

    Parece que reconoce en el esquema que hay un tipo, ArrayOfEmpleado, pero cuándo asigno el tipo Modificacion_BasicaResponse no indica el TAG "Secuence" y al importar la orquestación que usa dichos esquemas, produce un WSDL que indica:

    <s:schema targetNamespace="http://Rupx.Esquemas.WS_Modificacion_Salida" elementFormDefault="qualified"> 
     <s:element name="WS_Modificacion_Salida"> 
      <s:complexType> 
       <s:sequence> 
        <s:element name="ID" maxOccurs="1" minOccurs="0" form="unqualified" type="s:string"/> 
        <s:element name="Empleados" maxOccurs="1" minOccurs="0" form="unqualified"> 
         <s:complexType> 
          <s:sequence> 
           <s:element name="Empleado" maxOccurs="1" minOccurs="0" form="unqualified"> 
             <s:complexType> 
              <s:sequence>
               <s:element name="Resultado" maxOccurs="1" minOccurs="0" form="unqualified" type="s:string"/>
               <s:element name="NIF" maxOccurs="1" minOccurs="0" form="unqualified" type="s:string"/> 
              <s:element name="Error" maxOccurs="1" minOccurs="0" form="unqualified" type="s:string"/>
             </s:sequence>
            </s:complexType>
            </s:element> 
          </s:sequence>
          </s:complexType>
         </s:element> 
        </s:sequence>
      </s:complexType>
     </s:element>
     </s:schema>
    

     

    Sigue sin Devolver el elmento Empleados conteniendo varios elementos Empleado.

     

    No sé por dónde tirar.

     

    Gracias.

     

     


    Regards, Pablo Martín Gutierrez.
    martes, 7 de junio de 2011 12:38