none
Como agregar mandar parámetros a servicio web xml RRS feed

  • Pregunta

  • Hola

    Tengo mi cliente en windows forms y deseo enviarle como parámetro el nombre del archivo y un byte(viene a ser el xml en base 64)

    De esta manera debo enviarle el parámetro, según veo son dos parámetros.

    @WebMethod
    @WebResult(name = "RespuestaRecepcionComprobante")
    public RespuestaSolicitud validarComprobante(@WebParam(name = "xml") byte[] xml);

     El web service es el siguiente.

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ec.gob.sri.ws.recepcion" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="RecepcionComprobantesOfflineService" targetNamespace="http://ec.gob.sri.ws.recepcion">
      <wsdl:types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ec.gob.sri.ws.recepcion" elementFormDefault="unqualified" targetNamespace="http://ec.gob.sri.ws.recepcion" version="1.0">
    
      <xs:element name="RespuestaSolicitud" type="tns:respuestaSolicitud"/>
    
      <xs:element name="comprobante" type="tns:comprobante"/>
    
      <xs:element name="mensaje" type="tns:mensaje"/>
    
      <xs:element name="validarComprobante" type="tns:validarComprobante"/>
    
      <xs:element name="validarComprobanteResponse" type="tns:validarComprobanteResponse"/>
    
      <xs:complexType name="validarComprobante">
        <xs:sequence>
          <xs:element minOccurs="0" name="xml" type="xs:base64Binary"/>
        </xs:sequence>
      </xs:complexType>
    
      <xs:complexType name="validarComprobanteResponse">
        <xs:sequence>
          <xs:element minOccurs="0" name="RespuestaRecepcionComprobante" type="tns:respuestaSolicitud"/>
        </xs:sequence>
      </xs:complexType>
    
      <xs:complexType name="respuestaSolicitud">
        <xs:sequence>
          <xs:element minOccurs="0" name="estado" type="xs:string"/>
          <xs:element minOccurs="0" name="comprobantes">
            <xs:complexType>
              <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:comprobante"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    
      <xs:complexType name="comprobante">
        <xs:sequence>
          <xs:element minOccurs="0" name="claveAcceso" type="xs:string"/>
          <xs:element minOccurs="0" name="mensajes">
            <xs:complexType>
              <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:mensaje"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    
      <xs:complexType name="mensaje">
        <xs:sequence>
          <xs:element minOccurs="0" name="identificador" type="xs:string"/>
          <xs:element minOccurs="0" name="mensaje" type="xs:string"/>
          <xs:element minOccurs="0" name="informacionAdicional" type="xs:string"/>
          <xs:element minOccurs="0" name="tipo" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    
    </xs:schema>
      </wsdl:types>
      <wsdl:message name="validarComprobanteResponse">
        <wsdl:part element="tns:validarComprobanteResponse" name="parameters">
        </wsdl:part>
      </wsdl:message>
      <wsdl:message name="validarComprobante">
        <wsdl:part element="tns:validarComprobante" name="parameters">
        </wsdl:part>
      </wsdl:message>
      <wsdl:portType name="RecepcionComprobantesOffline">
        <wsdl:operation name="validarComprobante">
          <wsdl:input message="tns:validarComprobante" name="validarComprobante">
        </wsdl:input>
          <wsdl:output message="tns:validarComprobanteResponse" name="validarComprobanteResponse">
        </wsdl:output>
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="RecepcionComprobantesOfflineServiceSoapBinding" type="tns:RecepcionComprobantesOffline">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="validarComprobante">
          <soap:operation soapAction="" style="document"/>
          <wsdl:input name="validarComprobante">
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output name="validarComprobanteResponse">
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="RecepcionComprobantesOfflineService">
        <wsdl:port binding="tns:RecepcionComprobantesOfflineServiceSoapBinding" name="RecepcionComprobantesOfflinePort">
          <soap:address location="https://celcer.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>

    En esta parte me parece van los dos parámetros.

    <xs:complexType name="validarComprobante">
        <xs:sequence>
          <xs:element minOccurs="0" name="xml" type="xs:base64Binary"/>
        </xs:sequence>
      </xs:complexType>

    Me conecto de esta manera y le mando solo el byte.

    public class ValidarFactura
        {
    
            public Respuesta ConsultarRecepcion(byte[] strFactura)
            {
                return ComunicarSri(strFactura);
            }
    
    
            private Respuesta ComunicarSri(byte[] strFactura)
            {
                var resultado = string.Empty;
                //Respuesta respuesta = null;
                string url = "https://celcer.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl";
    
                string xml =
                    "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ec=\"http://ec.gob.sri.ws.recepcion\">";
                xml = xml + "<soapenv:Header/>";
                xml = xml + "<soapenv:Body>";
                xml = xml + "<ec:validarComprobante>";
                xml = xml + "<xml>" + strFactura + "</xml>";
                xml = xml + "</ec:validarComprobante>";
                xml = xml + "</soapenv:Body>";
                xml = xml + "</soapenv:Envelope>";
    
                byte[] bytes = Encoding.ASCII.GetBytes(xml);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    
                request.Method = "POST";
                request.ContentLength = bytes.Length;
                request.ContentType = "text/xml";
    
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
    
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(responseStream);
                    resultado = reader.ReadToEnd();
                }
                resultado = WebUtility.HtmlDecode(resultado);
                response.Close();
                var caracterPrincipal = resultado.IndexOf('?') - 1;
                var caracterSecundario = resultado.LastIndexOf('?') + 2;
                resultado = resultado.Remove(caracterPrincipal, (caracterSecundario - caracterPrincipal));
                resultado = "<?xml version=" + "\"1.0\"" + " encoding=" + "\"UTF-8\"" + "?>" + resultado;
                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
                doc.LoadXml(resultado);
    
                var respuesta = new Respuesta()
                {
                    Mensaje = doc.GetElementsByTagName("estado")[0].InnerText
                };
                return respuesta;
            }
    
        }

    ¿Como enviarle los dos parámetros si fuera el caso?

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 7 de enero de 2019 5:17

Respuestas

  • hola

    Pero es un web service o es un web method? porque para el web method no debrias necesitar un mensaje SOAP

    y si es un web service porque usas Webequest en lugar de crear un Web Reference al servicio he invocarlo por medio del proxy que se cree

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila lunes, 7 de enero de 2019 17:31
    lunes, 7 de enero de 2019 11:08

Todas las respuestas

  • hola

    Pero es un web service o es un web method? porque para el web method no debrias necesitar un mensaje SOAP

    y si es un web service porque usas Webequest en lugar de crear un Web Reference al servicio he invocarlo por medio del proxy que se cree

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pedro Ávila lunes, 7 de enero de 2019 17:31
    lunes, 7 de enero de 2019 11:08
  • Hola @Leandro

    Pero es un web service o es un web method? porque para el web method no debrias necesitar un mensaje SOAP

    y si es un web service porque usas Webequest en lugar de crear un Web Reference al servicio he invocarlo por medio del proxy que se cree

    Voy a investigar sobre un Web Reference, primera vez que trabajo con servicios.

    Gracias por las recomendaciones.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 7 de enero de 2019 14:41