none
Como agregar atributos a un nodo padre RRS feed

  • Pregunta

  • Hola

    Aunque la pregunta parecería obvia, no encontré un mejor  título.

    Necesito crear un SOAP con el formato que a continuación muestro.

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">  
       <soapenv:Header/>  
       <soapenv:Body>  
          <tem:ventas>  
             <!--Zero or more repetitions:-->  
             <tem:venta attr1="AttrVenta1" attr2 ="AttrVenta2">  
                <!--Zero or more repetitions:-->  
                <tem:material attr1="AttrMaterial1" attr2 ="AttrMaterial2"/>  
             </tem:venta>  
          </tem:ventas>  
       </soapenv:Body>  
    </soapenv:Envelope>  
    


    Lo que necesito es agregar atributos a los nodos venta y material. Ya tengo declarado mi contrato con lo siguiente:

        [DataContract]  
        public class material   
        {  
            [XmlAttribute]  
            public string attr1 { get; set; }  
            [XmlAttribute]  
            public string attr2 { get; set; }  
        }   
      
        [ServiceContract]  
        [XmlSerializerFormat]  
        public interface SrvVentas
        {  
            [OperationContract]  
            string ventas(material[] venta);           
        }


    Éste contrato genera el siguiente REQUEST:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">  
       <soapenv:Header/>  
       <soapenv:Body>  
          <tem:ventas>  
             <!--Optional:-->  
             <tem:venta>  
                <!--Zero or more repetitions:-->  
                <tem:material attr1="?" attr2="?"/>  
             </tem:venta>  
          </tem:ventas>  
       </soapenv:Body>  
    </soapenv:Envelope> 
    

    Es el formato que me han solicitado, el nodo material contiene los atributos necesarios, sin embargo, no se como puedo agregar los atributos al nodo venta.

    ¿Alguien me podría dar una idea de como hacerlo?

    Espero haber sido claro, 

    Saludos

    jueves, 21 de diciembre de 2017 22:13

Respuestas

  • hola

    pero como defines la clase que serializa el nodo ventas ? porque alli muestras un OperationContract, pero eso es el servicio con el metodo que expone, eso no es una clase

    se supone que el nodo venta deberia tener su clase propia como ser

    public class venta {
    
       public material[] ventas {get;set;}
    
    }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 22 de diciembre de 2017 12:21
  • hola

    pero como defines la clase que serializa el nodo ventas ? porque alli muestras un OperationContract, pero eso es el servicio con el metodo que expone, eso no es una clase

    se supone que el nodo venta deberia tener su clase propia como ser

    public class venta {
    
       public material[] ventas {get;set;}
    
    }

    Hola Leandro,

    Si yo creo una clase venta, me genera mas nodos de los que necesito, me explico.

    Si agrego la clase ventas de la siguiente forma:

        [DataContract]
        public class Material
        {
            [XmlAttribute]
            public string attr1 { get; set; }
            [XmlAttribute]
            public string attr2 { get; set; }
        }
    
        [DataContract]
        public class ventas
        {
            [XmlAttribute]
            public string attr1 { get; set; }
            [XmlAttribute]
            public string attr2 { get; set; }
            public Material[] material { get; set; }
        } 
    
    
        public interface SrvVentas
        {
    
            [OperationContract]
            string Ventas(ventas[] Venta);
        } 

    Se genera el siguiente SOAP

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                      xmlns:tem="http://tempuri.org/">
       <soapenv:Header/>
       <soapenv:Body>
          <tem:Ventas>
             <!--Optional:-->
             <tem:Venta>
                <!--Zero or more repetitions:-->
                <tem:ventas attr1="?" attr2="?">
                   <!--Optional:-->
                   <tem:material>
                      <!--Zero or more repetitions:-->
                      <tem:Material attr1="?" attr2="?"/>
                   </tem:material>
                </tem:ventas>
             </tem:Venta>
          </tem:Ventas>
       </soapenv:Body>
    </soapenv:Envelope>

    Lo cual difiere con el SOAP que se me requiere, de hecho fué lo primero que intenté, pero se están agregando más nodos de los que se requiere. 

    Saludos y gracias.

    viernes, 22 de diciembre de 2017 16:17
  • con que libreria estas serializando?

    porque lo que veo raro es que genere nodos en base a un metodo, entendia que la serializacion era de propiedades, pero en este caso usas

     string Ventas(ventas[] Venta);

    y eso lo usa en la serializacion

    Uso soapUI para importar el WSDL y me genera ese REQUEST.

    Lo mas probable es que no esté creando correctamente el contrato, soy nuevo en ésto de webServices con C# (normalmente los hago con Delphi) y me he basado en ejemplos que he encontrado aquí y allá.

    Saludos y gracias.

    viernes, 22 de diciembre de 2017 18:40

Todas las respuestas

  • Hola Eliseo GN

    De acuerdo a tu consulta, revisa el xml de venta, si te das cuenta aplica el xml como lo pusiste en venta y úsalo, solo cambiando los valores para nodo venta.

    Quedamos al pendiente de cualquier actualización de tu parte.

    Saludos Cordiales y felices fiestas.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 21 de diciembre de 2017 23:34
    Moderador
  • hola

    pero como defines la clase que serializa el nodo ventas ? porque alli muestras un OperationContract, pero eso es el servicio con el metodo que expone, eso no es una clase

    se supone que el nodo venta deberia tener su clase propia como ser

    public class venta {
    
       public material[] ventas {get;set;}
    
    }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 22 de diciembre de 2017 12:21
  • Muchas gracias Pablo

    Ya les dejaré saber los resultados.

    Saludos

    viernes, 22 de diciembre de 2017 15:38
  • hola

    pero como defines la clase que serializa el nodo ventas ? porque alli muestras un OperationContract, pero eso es el servicio con el metodo que expone, eso no es una clase

    se supone que el nodo venta deberia tener su clase propia como ser

    public class venta {
    
       public material[] ventas {get;set;}
    
    }

    Hola Leandro,

    Si yo creo una clase venta, me genera mas nodos de los que necesito, me explico.

    Si agrego la clase ventas de la siguiente forma:

        [DataContract]
        public class Material
        {
            [XmlAttribute]
            public string attr1 { get; set; }
            [XmlAttribute]
            public string attr2 { get; set; }
        }
    
        [DataContract]
        public class ventas
        {
            [XmlAttribute]
            public string attr1 { get; set; }
            [XmlAttribute]
            public string attr2 { get; set; }
            public Material[] material { get; set; }
        } 
    
    
        public interface SrvVentas
        {
    
            [OperationContract]
            string Ventas(ventas[] Venta);
        } 

    Se genera el siguiente SOAP

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                      xmlns:tem="http://tempuri.org/">
       <soapenv:Header/>
       <soapenv:Body>
          <tem:Ventas>
             <!--Optional:-->
             <tem:Venta>
                <!--Zero or more repetitions:-->
                <tem:ventas attr1="?" attr2="?">
                   <!--Optional:-->
                   <tem:material>
                      <!--Zero or more repetitions:-->
                      <tem:Material attr1="?" attr2="?"/>
                   </tem:material>
                </tem:ventas>
             </tem:Venta>
          </tem:Ventas>
       </soapenv:Body>
    </soapenv:Envelope>

    Lo cual difiere con el SOAP que se me requiere, de hecho fué lo primero que intenté, pero se están agregando más nodos de los que se requiere. 

    Saludos y gracias.

    viernes, 22 de diciembre de 2017 16:17
  • con que libreria estas serializando?

    porque lo que veo raro es que genere nodos en base a un metodo, entendia que la serializacion era de propiedades, pero en este caso usas

     string Ventas(ventas[] Venta);

    y eso lo usa en la serializacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 22 de diciembre de 2017 17:50
  • con que libreria estas serializando?

    porque lo que veo raro es que genere nodos en base a un metodo, entendia que la serializacion era de propiedades, pero en este caso usas

     string Ventas(ventas[] Venta);

    y eso lo usa en la serializacion

    Uso soapUI para importar el WSDL y me genera ese REQUEST.

    Lo mas probable es que no esté creando correctamente el contrato, soy nuevo en ésto de webServices con C# (normalmente los hago con Delphi) y me he basado en ejemplos que he encontrado aquí y allá.

    Saludos y gracias.

    viernes, 22 de diciembre de 2017 18:40