none
Service Reference conectado a Axis2 Web Service usando Mtom RRS feed

  • Pregunta

  • Tengo un cliente WCF que se conecta a un Axis2 Web Service y requiere que los mensajes se manden usando Mtom. El codigo de mi aplicacion consta de una clase para comunicacion:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace LibCegasVolPlus
    {
        public class Pruebas
        {
            static PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegateClient RequestConsu = new PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegateClient();
            static PruebaEnviaPEMEX.ServicioEnviaCONVOLClient RequestEnvio = new PruebaEnviaPEMEX.ServicioEnviaCONVOLClient();
    
            public static byte[] ConsultarArchivo(string cNombreArchivo)
            {
                //Trust all certificates
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
    
                ArchivoRespuesta = RequestConsu.consultaCONVOL(cNombreArchivo);
    
                return ArchivoRespuesta;
            }
    
            public static byte[] EnviarArchivo(byte[] ArchivoEnvio, string Checksum)
            {
                //Trust all certificates
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
                            
                ArchivoRespuesta = RequestEnvio.enviaCONVOL("27/11/2014", "12:49:35", ArchivoEnvio, Checksum);
    
                return ArchivoRespuesta;
            }
        }
    }
    

    Un formulario como interfaz grafica:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    using System.Windows.Forms;
    using LibCegasVolPlus;
    using LibCegasVolPlus.Utilerias;
    
    namespace WinCegasVolPlus
    {
        public partial class Form1 : Form
        {
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnConsultar_Click(object sender, EventArgs e)
            {
                try
                {
                    byte[] Archivo;
    
                    Archivo = LibCegasVolPlus.Pruebas.ConsultarArchivo("1234567890E1234520141127.105030ACP020530MP5.xml");
    
                    File.WriteAllBytes(@"C:\PruebasPEMEX\Respuesta.xml", Archivo);
    
                    MessageBox.Show("Respuesta recibida");
                }
                catch (Exception Ex)
                {
                    MessageBox.Show(Ex.Message);
                }
            }
    
            private void btnEnviar_Click(object sender, EventArgs e)
            {
                try
                {
                    byte[] ArchivoRespuesta;
                    byte[] ArchivoEnvio = new byte[8];
    
                    SHA256 mySHA256 = SHA256Managed.Create();
                    byte[] ChecksumSHA256;
                    ChecksumSHA256 = mySHA256.ComputeHash(ArchivoEnvio);
                    string ChecksumSHA256Base64 = Encriptador.Instancia.ConvertirBase64(ChecksumSHA256);
                    //byte[] hashSHA256Base64 = Convert.FromBase64String(chashSHA256Base64);
    
                    ArchivoRespuesta = LibCegasVolPlus.Pruebas.EnviarArchivo(ArchivoEnvio, ChecksumSHA256Base64);
    
                    File.WriteAllBytes(@"C:\PruebasPEMEX\Respuesta.xml", ArchivoRespuesta);
    
                    MessageBox.Show("Respuesta recibida");
                }
                catch (Exception Ex)
                {
                    MessageBox.Show(Ex.Message);
                }
            }
        }
    }
    

    y un archivo .config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      </startup>
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="ServicioConsultaCONVOLPortBinding" messageEncoding="Mtom">
              <security mode="Transport" />
            </binding>
            <binding name="ServicioEnviaCONVOLPortBinding" messageEncoding="Mtom">
              <security mode="Transport" />
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="https://www.convolmiscelaneapruebas.pemex.com:443/ServiciosCVWEB/ServicioConsultaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioConsultaCONVOLPortBinding"
              contract="PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegate"
              name="ServicioConsultaCONVOLPort" />
          <endpoint address="https://www.convolmiscelaneapruebas.pemex.com:443/ServiciosCVWEB/ServicioEnviaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioEnviaCONVOLPortBinding"
              contract="PruebaEnviaPEMEX.ServicioEnviaCONVOL"
              name="ServicioEnviaCONVOLPort" />
          <endpoint address="https://www.convol.pemex.com:443/ServiciosCVWEB/ServicioConsultaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioConsultaCONVOLPortBinding"
              contract="ConsultaPEMEX.ServicioConsultaCONVOLDelegate"
              name="ServicioConsultaCONVOLPort" />
          <endpoint address="https://www.convol.pemex.com:443/ServiciosCVWEB/ServicioEnviaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioEnviaCONVOLPortBinding"
              contract="EnviaPEMEX.ServicioEnviaCONVOL"
              name="ServicioEnviaCONVOLPort" />
        </client>
      </system.serviceModel>
    </configuration>


    Al momento de hacer uso del servicio para consultas:

            public static byte[] ConsultarArchivo(string cNombreArchivo)
            {
                //Trust all certificates
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
    
                ArchivoRespuesta = RequestConsu.consultaCONVOL(cNombreArchivo);
    
                return ArchivoRespuesta;
            }

    No hay ningun problema, me regresa la respuesta.

    Pero al momento de hacer uso del servicio para envio:

            public static byte[] EnviarArchivo(byte[] ArchivoEnvio, string Checksum)
            {
                //Trust all certificates
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
                            
                ArchivoRespuesta = RequestEnvio.enviaCONVOL("27/11/2014", "12:49:35", ArchivoEnvio, Checksum);
    
                return ArchivoRespuesta;
            }


    Me marca los siguientes errores:

    Error al crear un lector para el mensaje MTOM.

    Los mensajes MTOM deben tener el tipo 'application/xop+xml'.

    Los dos servicios se supone funcionan de la misma manera, es decir los dos deben tener implementado el uso de Mtom. Agrego las clases e interfaces que puedo usar con cada servicio.

    PruebaConsultaPEMEX:

    class consultaCONVOLRequest
    class consultaCONVOLRequestBody
    class consultaCONVOLResponse
    class consultaCONVOLResponseBody
    class ServicioConsultaCONVOLDelegateClient
    
    interface ServicioConsultaCONVOLDelegate
    interface ServicioConsultaCONVOLDelegateChannel


    PruebaEnviaPEMEX:

    class enviaCONVOLRequest
    class enviaCONVOLRequestBody
    class enviaCONVOLResponse
    class enviaCONVOLResponseBody
    class ServicioEnviaCONVOLClient
    
    interface ServicioEnviaCONVOL
    interface ServicioEnviaCONVOLChannel

    ¿Estoy implementando de manera correcta Mtom?

    ¿Cual podria ser el problema al hacer uso del servicio de envio?

    He estado leyendo mucho en google pero no doy con el problema. Muchas gracias por su tiempo...

    sábado, 29 de noviembre de 2014 17:48

Respuestas

  • Gracias a la ayuda de JeBusSoft y Omar Chavez, encontramos la solucion.

    Config final:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      </startup>
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="ServicioConsultaCONVOLPortBinding">
              <security mode="Transport" />
            </binding>
            <binding name="ServicioEnviaCONVOLPortBinding" messageEncoding="Mtom">
              <security mode="Transport" />
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="https://www.convolmiscelaneapruebas.pemex.com:443/ServiciosCVWEB/ServicioConsultaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioConsultaCONVOLPortBinding"
              contract="PruebaServicioConsultaCONVOLDelegate"
              name="ServicioConsultaCONVOLPort" />
          <endpoint address="https://www.convolmiscelaneapruebas.pemex.com:443/ServiciosCVWEB/ServicioEnviaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioEnviaCONVOLPortBinding"
              contract="PruebaServicioEnviaCONVOL"
              name="ServicioEnviaCONVOLPort" />
          <endpoint address="https://www.convol.pemex.com:443/ServiciosCVWEB/ServicioConsultaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioConsultaCONVOLPortBinding"
              contract="ServicioConsultaCONVOLDelegate"
              name="ServicioConsultaCONVOLPort" />
          <endpoint address="https://www.convol.pemex.com:443/ServiciosCVWEB/ServicioEnviaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioEnviaCONVOLPortBinding"
              contract="ServicioEnviaCONVOL"
              name="ServicioEnviaCONVOLPort" />     
        </client>
      </system.serviceModel>
    </configuration>


    Uso del servicio:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates;
    using System.Security.Permissions;
    using System.Text;
    
    namespace ArchivosPEMEX
    {
        [System.Runtime.Serialization.DataContract()]
        public class Seguridad
        {
            [System.Runtime.Serialization.DataMember(Order = 0)]
            public string usuario;
    
            [System.Runtime.Serialization.DataMember(Order = 1)]
            public string password;
    
            [System.Runtime.Serialization.DataMember(Order = 2)]
            public string fechaSistema;
        }
    
        public class Pruebas
        {
            static ConsultaPEMEX.ServicioConsultaCONVOLDelegateClient RequestConsu = new ConsultaPEMEX.ServicioConsultaCONVOLDelegateClient();
            static EnviaPEMEX.ServicioEnviaCONVOLClient RequestEnvio = new EnviaPEMEX.ServicioEnviaCONVOLClient();
            static PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegateClient RequestPruebaConsu = new PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegateClient();
            static PruebaEnviaPEMEX.ServicioEnviaCONVOLClient RequestPruebaEnvio = new PruebaEnviaPEMEX.ServicioEnviaCONVOLClient();
    
            public static string getHashSha256(string text)
            {
                byte[] bytes = Encoding.UTF8.GetBytes(text);
                SHA256Managed hashstring = new SHA256Managed();
                byte[] hash = hashstring.ComputeHash(bytes);
                string hashString = string.Empty;
                foreach (byte x in hash)
                {
                    hashString += String.Format("{0:x2}", x);
                }
                return hashString;
            }
    
            public static byte[] ConsultarArchivo(string cNombreArchivo)
            {
                byte[] ArchivoRespuesta;
    
                ArchivoRespuesta = RequestConsu.consultaCONVOL(cNombreArchivo);
    
                return ArchivoRespuesta;
            }
    
            public static byte[] EnviarArchivo(byte[] ArchivoEnvio, string Checksum, string cUsuario, string cPassword, string cFecha, string cHora)
            {
                byte[] ArchivoRespuesta;
    
                string cPasswordSHA256 = getHashSha256(cUsuario + cPassword + DateTime.Now.ToString("dd/MM/yyyy"));
    
                using (System.ServiceModel.OperationContextScope scope = new System.ServiceModel.OperationContextScope(RequestEnvio.InnerChannel))
                {
                    System.ServiceModel.Channels.MessageHeader header = System.ServiceModel.Channels.MessageHeader.CreateHeader(
                        "Seguridad",
                        "http://ws.convol/",
                        new Seguridad { usuario = cUsuario, password = cPasswordSHA256, fechaSistema = DateTime.Now.ToString("dd/MM/yyyy") },
                        false);
    
                    System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(header);
    
                    ArchivoRespuesta = RequestEnvio.enviaCONVOL(cFecha, cHora, ArchivoEnvio, Checksum);
                }
    
                return ArchivoRespuesta;
            }
    
            public static byte[] PruebaConsultarArchivo(string cNombreArchivo)
            {
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
    
                ArchivoRespuesta = RequestPruebaConsu.consultaCONVOL(cNombreArchivo);
    
                return ArchivoRespuesta;
            }
    
            public static byte[] PruebaEnviarArchivo(byte[] ArchivoEnvio, string Checksum, string cUsuario, string cPassword, string cFecha, string cHora)
            {
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
    
                string cPasswordSHA256 = getHashSha256(cUsuario + cPassword + DateTime.Now.ToString("dd/MM/yyyy"));
    
                using (System.ServiceModel.OperationContextScope scope = new System.ServiceModel.OperationContextScope(RequestPruebaEnvio.InnerChannel))
                {
                    System.ServiceModel.Channels.MessageHeader header = System.ServiceModel.Channels.MessageHeader.CreateHeader(
                        "Seguridad",
                        "http://ws.convol/",
                        new Seguridad { usuario = cUsuario, password = cPasswordSHA256, fechaSistema = DateTime.Now.ToString("dd/MM/yyyy") },
                        false);
    
                    System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(header);
    
                    ArchivoRespuesta = RequestPruebaEnvio.enviaCONVOL(cFecha, cHora, ArchivoEnvio, Checksum);
                }
    
                return ArchivoRespuesta;
            }
        }
    }

    El usuario para el envio en produccion y en pruebas es el mismo (clave SIIC) pero la contraseña en pruebas es pemex99999.

    Saludos...


    • Marcado como respuesta Jesus Castelo jueves, 11 de diciembre de 2014 22:54
    • Editado Jesus Castelo jueves, 11 de diciembre de 2014 22:59
    jueves, 11 de diciembre de 2014 22:52

Todas las respuestas

  • Ninguna idea ??? :(

    Esto es lo que me dice fiddler al usar el servicio de envio de prueba.

    Lo que yo envio:

    --uuid:1aacb6a0-876f-4c32-9563-3f68b9bff2f2+id=1
    Content-ID: <http://tempuri.org/0>
    Content-Transfer-Encoding: 8bit
    Content-Type: application/xop+xml;charset=utf-8;type="text/xml"

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><enviaCONVOL xmlns="http://ws.convol/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><arg0 xmlns="">27/11/2014</arg0><arg1 xmlns="">12:49:35</arg1><arg2 xmlns="">AAAAAAAAAAA=</arg2><arg3 xmlns="">r1Vw9aGBC3r3jK9LxwpmDw31HkK6+R1N5bIyjeDoPfw=</arg3></enviaCONVOL></s:Body></s:Envelope>
    --uuid:1aacb6a0-876f-4c32-9563-3f68b9bff2f2+id=1--


    Lo que me envian:

    --MIMEBoundary_67e6aebc674ac3ab1474860e7312234ab12e2d54c0b6b4f1
    Content-Type: text/xml; charset=utf-8
    Content-Transfer-Encoding: binary
    Content-ID: <0.77e6aebc674ac3ab1474860e7312234ab12e2d54c0b6b4f1@apache.org>

    <?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><ns2:enviaCONVOL xmlns:ns2="http://ws.convol/"><arg0>27/11/2014</arg0><arg1>12:49:35</arg1><arg2>AAAAAAAAAAA=</arg2><arg3>r1Vw9aGBC3r3jK9LxwpmDw31HkK6+R1N5bIyjeDoPfw=</arg3></ns2:enviaCONVOL><s:Fault><faultcode>s:Server</faultcode><faultstring>300|No hay datos en header para seguridad</faultstring></s:Fault></s:Body></s:Envelope>
    --MIMEBoundary_67e6aebc674ac3ab1474860e7312234ab12e2d54c0b6b4f1
    Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
    Content-Transfer-Encoding: binary
    Content-ID: <http://tempuri.org/0>

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><enviaCONVOL xmlns="http://ws.convol/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><arg0 xmlns="">27/11/2014</arg0><arg1 xmlns="">12:49:35</arg1><arg2 xmlns="">AAAAAAAAAAA=</arg2><arg3 xmlns="">r1Vw9aGBC3r3jK9LxwpmDw31HkK6+R1N5bIyjeDoPfw=</arg3></enviaCONVOL></s:Body></s:Envelope>
    --MIMEBoundary_67e6aebc674ac3ab1474860e7312234ab12e2d54c0b6b4f1--



    Veo que dice "No hay datos en header para seguridad", aunque sea de pruebas creen que necesite el usuario y password de produccion? como agrego un header para seguridad en mi cliente de WCF?

    Gracias por su tiempo...
    lunes, 1 de diciembre de 2014 23:54
  • Prueba esto para el MTO:

    <wsHttpBinding> <binding name="WSHttpBinding_IUpload" messageEncoding="Mtom"/> </wsHttpBinding>

    Saludos!

    miércoles, 3 de diciembre de 2014 21:03
  • Tuviste el siguiente mensaje de error cuando consumes el enviaCONVOL(Fecha, Hora, zip, cadenaFinal)?

    El esquema de URI proporcionado 'https' no es válido; se esperaba 'http'.
    Nombre del parámetro: via

    Saludos!

    miércoles, 3 de diciembre de 2014 23:13
  • prueba esto:

          <wsHttpBinding>
            <binding name="ServicioEnviaCONVOLPortBinding" closeTimeout="00:10:00"
              openTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true"
              maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
              messageEncoding="Mtom">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
              <security mode="Transport">
                <transport clientCredentialType="None">
                  <extendedProtectionPolicy policyEnforcement="Never" />
                </transport>
              </security>
            </binding>
          </wsHttpBinding>

    pero igual sigue sin funcionar, no te marca ningun problema con el https pero me dice el mismo error:

    Error al crear un lector para el mensaje MTOM.

    Los mensajes MTOM deben tener el tipo 'application/xop+xml'.



    jueves, 4 de diciembre de 2014 16:21
  • Para el Error al crear un lector para el mensaje MTOM usa esta configuracion del <security> dentro del Tag <binding> para especificar el tipo de seguridad usado para el mensaje Mtom, debido a que el URI del Servicio Web es HTTPS  :)

    <wsHttpBinding>
         <binding name="ServicioConsultaCONVOLPortBinding"
                    ..........
                     messageEncoding="Mtom">
    
            <security mode="TransportWithMessageCredential" >
                 <message clientCredentialType="Certificate" />
            </security>
         </binding>
    </wsHttpBinding>

    Despues de esto, estoy recibiendo el mensaje de error: ''Se recibió un error no seguro o protegido incorrectamente de la otra parte. Consulte la excepción FaultException interna para ver el código del error y obtener más información"

    Al parecer es debido al usuario y contraseña que se tiene que especificar en las credenciales del Web Service de prueba.

    objPruebasServicioEnvia.ClientCredentials.UserName.UserName = "UserName " ???
    objPruebasServicioEnvia.ClientCredentials.UserName.Password = "Password ???


    Saludos Colega :) !



    • Editado JeBusSoft jueves, 4 de diciembre de 2014 17:56
    jueves, 4 de diciembre de 2014 17:50
  • Esto es lo que me dice Fiddler con esa ultima configuracion que te mencione, aqui si veo un cambio:

    Lo que yo envio:

    --uuid:08952dca-b6c3-463d-b9f2-071c0ca4df4d+id=1
    Content-ID: <http://tempuri.org/0>
    Content-Transfer-Encoding: 8bit
    Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"

    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://ws.convol/ServicioEnviaCONVOL/enviaCONVOLRequest</a:Action><a:MessageID>urn:uuid:63903375-53fb-41a3-9fc8-ee5da6559b1a</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">https://www.convolmiscelaneapruebas.pemex.com/ServiciosCVWEB/ServicioEnviaCONVOLService</a:To></s:Header><s:Body><enviaCONVOL xmlns="http://ws.convol/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><arg0 xmlns="">27/11/2014</arg0><arg1 xmlns="">12:49:35</arg1><arg2 xmlns="">AAAAAAAAAAA=</arg2><arg3 xmlns="">r1Vw9aGBC3r3jK9LxwpmDw31HkK6+R1N5bIyjeDoPfw=</arg3></enviaCONVOL></s:Body></s:Envelope>
    --uuid:08952dca-b6c3-463d-b9f2-071c0ca4df4d+id=1--

    Lo que me envian:

    --MIMEBoundary_a7e6aebc674ac3abf9ca694e7312234ae12e2d54c0b6b4f1
    Content-Type: application/soap+xml; charset=utf-8
    Content-Transfer-Encoding: binary
    Content-ID: <0.b7e6aebc674ac3abf9ca694e7312234ae12e2d54c0b6b4f1@apache.org>

    <?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><a:Action s:mustUnderstand="1">http://ws.convol/ServicioEnviaCONVOL/enviaCONVOLRequest</a:Action><a:MessageID>urn:uuid:63903375-53fb-41a3-9fc8-ee5da6559b1a</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">https://www.convolmiscelaneapruebas.pemex.com/ServiciosCVWEB/ServicioEnviaCONVOLService</a:To><wsa:RelatesTo>urn:uuid:63903375-53fb-41a3-9fc8-ee5da6559b1a</wsa:RelatesTo></s:Header><s:Body><ns2:enviaCONVOL xmlns:ns2="http://ws.convol/"><arg0>27/11/2014</arg0><arg1>12:49:35</arg1><arg2>AAAAAAAAAAA=</arg2><arg3>r1Vw9aGBC3r3jK9LxwpmDw31HkK6+R1N5bIyjeDoPfw=</arg3></ns2:enviaCONVOL><s:Fault xmlns:env="http://www.w3.org/2003/05/soap-envelope"><axis2ns1:Code xmlns:axis2ns1="http://www.w3.org/2003/05/soap-envelope"><axis2ns1:Value>env:Receiver</axis2ns1:Value></axis2ns1:Code><axis2ns1:Reason xmlns:axis2ns1="http://www.w3.org/2003/05/soap-envelope"><s:Text xml:lang="en-US">302|Usuario invalido, no se permite acceso</s:Text></axis2ns1:Reason></s:Fault></s:Body></s:Envelope>
    --MIMEBoundary_a7e6aebc674ac3abf9ca694e7312234ae12e2d54c0b6b4f1
    Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"
    Content-Transfer-Encoding: binary
    Content-ID: <http://tempuri.org/0>

    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://ws.convol/ServicioEnviaCONVOL/enviaCONVOLRequest</a:Action><a:MessageID>urn:uuid:63903375-53fb-41a3-9fc8-ee5da6559b1a</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">https://www.convolmiscelaneapruebas.pemex.com/ServiciosCVWEB/ServicioEnviaCONVOLService</a:To></s:Header><s:Body><enviaCONVOL xmlns="http://ws.convol/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><arg0 xmlns="">27/11/2014</arg0><arg1 xmlns="">12:49:35</arg1><arg2 xmlns="">AAAAAAAAAAA=</arg2><arg3 xmlns="">r1Vw9aGBC3r3jK9LxwpmDw31HkK6+R1N5bIyjeDoPfw=</arg3></enviaCONVOL></s:Body></s:Envelope>
    --MIMEBoundary_a7e6aebc674ac3abf9ca694e7312234ae12e2d54c0b6b4f1--

    Ahora el mensaje cambio a "302|Usuario invalido, no se permite acceso", por ahi le estoy buscando ahora, no se si sea realmente que estoy enviando mal el usuario y contraseña o si es mas bien que no estoy configurando bien el binding.


    jueves, 4 de diciembre de 2014 18:21
  • Es un error pre-programado que regresa el Web Service, deacuerdo a las especificaciones de la tabla de los mensajes de respuesta para el Servicio:

    ANEXO 1-Tabla de errores en comunicación SOAP y recepción de archivos.
    Errores de SOAPFaultException:
    300|No hay datos en header para seguridad
    301|No usuario en header
    302|Usuario invalido, no se permite acceso
    303|No password en header
    304|Tamaño password invalido, no se permite acceso
    305|No fecha en header
    306|Formato fecha sistema invalido, no se permite acceso
    307|Fecha sistema invalido, no se permite acceso
    308|Favor de intentar mas tarde
    309|Password invalido, no se permite acceso

    Esto me deja en que si se va a necesitar un usuario y password validos para el web service de prueba.

    Saludos colega!



    • Editado JeBusSoft viernes, 5 de diciembre de 2014 16:36
    viernes, 5 de diciembre de 2014 0:40
  • JeBus o Jesus Castelo,  Tienen el archivo de especificaciones del CONVOL 2 que entregó pemex? .. será posible que me lo hagan llegar a mi correo? omar_chavez ARROBA hotmail PUNTO com

    Saludos!


    MC. Omar Chávez



    lunes, 8 de diciembre de 2014 1:35
  • Gracias JeBusSoft estoy intentando comunicarme con los de PEMEX para que me envien un certificado valido.
    lunes, 8 de diciembre de 2014 18:35
  • Hable con personal de PEMEX y me dicen que no necesito un certificado para conectarme a su servicio, con que envie el usuario y contraseña en el header debe funcionar. Como deberia configurar mi webservice para que use una direccion https pero que no requiera un certificado?
    lunes, 8 de diciembre de 2014 20:09
  • Que tal MC. Omar Chávez, la informacion que provee el Sat sobre el tema, esta en la siguiente liga:

    http://www.sat.gob.mx/fichas_tematicas/controles_volumetricos/Paginas/default.aspx


    Saludos!

    lunes, 8 de diciembre de 2014 21:37
  • Que tal Jesus Castelo, no creo que el detalle sea el certificado de seguridad, sino el usuario y contraseñara correctos que se necesita mandar en el Header SOAP.

    La configuración del Web Service en el lado del cliente quedaria igual:

    <basicHttpBinding>
         <binding name="ServicioEnviaCONVOLPortBinding"
                             messageEncoding="Mtom">
              <security mode="TransportWithMessageCredential">
              <message clientCredentialType="UserName"
                             algorithmSuite="Default" />
              </security>
         </binding>
    </basicHttpBinding>

    Saludos!

    lunes, 8 de diciembre de 2014 21:45
  • Hola JeBusSoft,

    Gracias por el interes en mi problema, al final me quede con esta configuracion, creo que es la correcta:

          <wsHttpBinding>
            <binding name="ServicioEnviaCONVOLPortBinding" closeTimeout="00:10:00"
              openTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true"
              maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
              messageEncoding="Mtom">
              <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
              <security mode="Transport">
                <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
              </security>
            </binding>
          </wsHttpBinding>

    Aun me envia el error en el fiddler de 302|Usuario invalido, no se permite acceso,  el password para usar el servicio debe armarse de la siguiente manera, segun la informacion de PEMEX:

    (d) Considerar como nodo principal : "Seguridad" integrando tres elementos en la cabecera del mensaje SOAP:
    1.-“usuario” a 10 caracteres alfanumérico integrar ceros para completar la sección izquierda.
    Ejemplo: 0000104142
    2.-“password” deberá contener el resultado de la digestión SHA256 del armado de la cadena: clave de usuario (10 caracteres), seguido de password (8 caracteres) y fecha del sistema(dd/mm/yyyy).
    Ej: 0000112014pemexcv01418/05/2014
    8fdbb69930e907df8f58ee6595a8e2c4d93d4aab4adc5b77df2dbc7e2f150194
    3.-“fechaSistema” fecha del sistema que utiliza para realizar la transmisión a Pemex con formato (dd/mm/yyyy).

    Incluso ponen un ejemplo de como deberia quedar el mensaje SOAP:

    Armado de atributos del SOAP Envelope:

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:nsl="http://ws.convol/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    Armado de TAG de seguridad en SOAP Header, se representa en diferentes líneas
    solo como referencia:

    <SOAP-ENV:Header>
       <Seguridad>
          <usuario>0000110759</usuario><password>3c62d084fd15d71227676438a8c51d04ed432aa825b78129c4f45b433d0819</password><fechaSistema>29/09/2014</fechaSistema>
       </Seguridad>
    </SOAP-ENV:Header>

    Mi codigo en c#:

    public static byte[] PruebaEnviarArchivo(byte[] ArchivoEnvio, string Checksum) { byte[] ArchivoRespuesta; if (RequestPruebaEnvio.ClientCredentials.UserName.UserName == null) RequestPruebaEnvio.ClientCredentials.UserName.UserName = "0000104142"; if (RequestPruebaEnvio.ClientCredentials.UserName.Password == null)

    RequestPruebaEnvio.ClientCredentials.UserName.Password = "67177119501C7C0B7E2E7B39D414E95430273E4C307393A72BEF3A66C1BBEDDB";

    ArchivoRespuesta = RequestPruebaEnvio.enviaCONVOL("27/11/2014", "12:49:35", ArchivoEnvio, Checksum); return ArchivoRespuesta; }


    Claro el UserName que expongo aqui es el de ejemplo pero ya he intentado con un UserName y Password reales y obtengo el mismo mensaje de respuesta.

    La cadena SHA256 la genero con esta calculadora Online:

    http://www.convertstring.com/es/Hash/SHA256


    martes, 9 de diciembre de 2014 0:16
  • Que tal Jesus Castelo, yo también estoy en el mismo detalle que tu, de acuerdo mis nuevas indicaciones, el siguiente pasó es que te pongas en contacto con tu contacto de PEMEX y les digas que  estas listo para realizar las pruebas para que te habiliten la recepción de archivos en los servicios de prueba para tu usuario de PEMEX de la estación de servicio designada.

    Gracias por la retro alimentación de la configuración en el wsHttpBinding, la tendré presente. Aquí vamos a seguir trabajando en colaboración :)

    Saludos!

    martes, 9 de diciembre de 2014 18:23
  • Hola JeBusSoft,

    Ya envie un correo a PEMEX, estoy esperando respuesta. Recuerdo por ahi que lei o escuche de que hay un usuario de pruebas, tienes tu esa informacion??

    martes, 9 de diciembre de 2014 20:12
  • Gracias a la ayuda de JeBusSoft y Omar Chavez, encontramos la solucion.

    Config final:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      </startup>
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="ServicioConsultaCONVOLPortBinding">
              <security mode="Transport" />
            </binding>
            <binding name="ServicioEnviaCONVOLPortBinding" messageEncoding="Mtom">
              <security mode="Transport" />
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="https://www.convolmiscelaneapruebas.pemex.com:443/ServiciosCVWEB/ServicioConsultaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioConsultaCONVOLPortBinding"
              contract="PruebaServicioConsultaCONVOLDelegate"
              name="ServicioConsultaCONVOLPort" />
          <endpoint address="https://www.convolmiscelaneapruebas.pemex.com:443/ServiciosCVWEB/ServicioEnviaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioEnviaCONVOLPortBinding"
              contract="PruebaServicioEnviaCONVOL"
              name="ServicioEnviaCONVOLPort" />
          <endpoint address="https://www.convol.pemex.com:443/ServiciosCVWEB/ServicioConsultaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioConsultaCONVOLPortBinding"
              contract="ServicioConsultaCONVOLDelegate"
              name="ServicioConsultaCONVOLPort" />
          <endpoint address="https://www.convol.pemex.com:443/ServiciosCVWEB/ServicioEnviaCONVOLService"
              binding="basicHttpBinding" bindingConfiguration="ServicioEnviaCONVOLPortBinding"
              contract="ServicioEnviaCONVOL"
              name="ServicioEnviaCONVOLPort" />     
        </client>
      </system.serviceModel>
    </configuration>


    Uso del servicio:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates;
    using System.Security.Permissions;
    using System.Text;
    
    namespace ArchivosPEMEX
    {
        [System.Runtime.Serialization.DataContract()]
        public class Seguridad
        {
            [System.Runtime.Serialization.DataMember(Order = 0)]
            public string usuario;
    
            [System.Runtime.Serialization.DataMember(Order = 1)]
            public string password;
    
            [System.Runtime.Serialization.DataMember(Order = 2)]
            public string fechaSistema;
        }
    
        public class Pruebas
        {
            static ConsultaPEMEX.ServicioConsultaCONVOLDelegateClient RequestConsu = new ConsultaPEMEX.ServicioConsultaCONVOLDelegateClient();
            static EnviaPEMEX.ServicioEnviaCONVOLClient RequestEnvio = new EnviaPEMEX.ServicioEnviaCONVOLClient();
            static PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegateClient RequestPruebaConsu = new PruebaConsultaPEMEX.ServicioConsultaCONVOLDelegateClient();
            static PruebaEnviaPEMEX.ServicioEnviaCONVOLClient RequestPruebaEnvio = new PruebaEnviaPEMEX.ServicioEnviaCONVOLClient();
    
            public static string getHashSha256(string text)
            {
                byte[] bytes = Encoding.UTF8.GetBytes(text);
                SHA256Managed hashstring = new SHA256Managed();
                byte[] hash = hashstring.ComputeHash(bytes);
                string hashString = string.Empty;
                foreach (byte x in hash)
                {
                    hashString += String.Format("{0:x2}", x);
                }
                return hashString;
            }
    
            public static byte[] ConsultarArchivo(string cNombreArchivo)
            {
                byte[] ArchivoRespuesta;
    
                ArchivoRespuesta = RequestConsu.consultaCONVOL(cNombreArchivo);
    
                return ArchivoRespuesta;
            }
    
            public static byte[] EnviarArchivo(byte[] ArchivoEnvio, string Checksum, string cUsuario, string cPassword, string cFecha, string cHora)
            {
                byte[] ArchivoRespuesta;
    
                string cPasswordSHA256 = getHashSha256(cUsuario + cPassword + DateTime.Now.ToString("dd/MM/yyyy"));
    
                using (System.ServiceModel.OperationContextScope scope = new System.ServiceModel.OperationContextScope(RequestEnvio.InnerChannel))
                {
                    System.ServiceModel.Channels.MessageHeader header = System.ServiceModel.Channels.MessageHeader.CreateHeader(
                        "Seguridad",
                        "http://ws.convol/",
                        new Seguridad { usuario = cUsuario, password = cPasswordSHA256, fechaSistema = DateTime.Now.ToString("dd/MM/yyyy") },
                        false);
    
                    System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(header);
    
                    ArchivoRespuesta = RequestEnvio.enviaCONVOL(cFecha, cHora, ArchivoEnvio, Checksum);
                }
    
                return ArchivoRespuesta;
            }
    
            public static byte[] PruebaConsultarArchivo(string cNombreArchivo)
            {
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
    
                ArchivoRespuesta = RequestPruebaConsu.consultaCONVOL(cNombreArchivo);
    
                return ArchivoRespuesta;
            }
    
            public static byte[] PruebaEnviarArchivo(byte[] ArchivoEnvio, string Checksum, string cUsuario, string cPassword, string cFecha, string cHora)
            {
                System.Net.ServicePointManager.ServerCertificateValidationCallback =
                    ((sender, certificate, chain, sslPolicyErrors) => true);
    
                byte[] ArchivoRespuesta;
    
                string cPasswordSHA256 = getHashSha256(cUsuario + cPassword + DateTime.Now.ToString("dd/MM/yyyy"));
    
                using (System.ServiceModel.OperationContextScope scope = new System.ServiceModel.OperationContextScope(RequestPruebaEnvio.InnerChannel))
                {
                    System.ServiceModel.Channels.MessageHeader header = System.ServiceModel.Channels.MessageHeader.CreateHeader(
                        "Seguridad",
                        "http://ws.convol/",
                        new Seguridad { usuario = cUsuario, password = cPasswordSHA256, fechaSistema = DateTime.Now.ToString("dd/MM/yyyy") },
                        false);
    
                    System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(header);
    
                    ArchivoRespuesta = RequestPruebaEnvio.enviaCONVOL(cFecha, cHora, ArchivoEnvio, Checksum);
                }
    
                return ArchivoRespuesta;
            }
        }
    }

    El usuario para el envio en produccion y en pruebas es el mismo (clave SIIC) pero la contraseña en pruebas es pemex99999.

    Saludos...


    • Marcado como respuesta Jesus Castelo jueves, 11 de diciembre de 2014 22:54
    • Editado Jesus Castelo jueves, 11 de diciembre de 2014 22:59
    jueves, 11 de diciembre de 2014 22:52
  • Que tal  Jesús Castelo!

    Una disculpa por la ausencia, me detuve unos días por otro proyecto en el que estuve trabajando, pero siguiendo tus indicaciones, también he logrado con éxito realizar y obtener la respuesta de la transferencia del archivo XML.

    Muchas gracias, seguiremos trabajando en esto el resto y comienzo del año.

    Saludos!

    martes, 23 de diciembre de 2014 0:27
  • En el proceso de transmisión el Web Service para  el archivo comprimido me manda este error:

    <acceso clave='413'
    descripcion='Archivo sin formato para descomprimir o más de un archivo XML en archivo ZIP'>
    </acceso>

    Usando las clases ZipOutputStream y GZipStream. Pero si lo comprimo manualmente con Winzip o Winrar me lo acepta.

    Alguna idea colegas?
    Saludos!


    • Editado JeBusSoft miércoles, 24 de diciembre de 2014 2:57
    miércoles, 24 de diciembre de 2014 2:57
  • te recomiendo que uses ionic.zip http://dotnetzip.codeplex.com/
    miércoles, 24 de diciembre de 2014 18:42
  • Gracias por tu respuesta Leo SH!

    Acertadamente, las clases ZipOutputStream y GZipStream no son compatibles con las funciones de validacion para el archivo ZIP del web Service. 

    La libreria ionic.zip funciono perfectamente:

    Dim sZipFileName As String Dim btResult As Byte() Dim outputMemStream As New MemoryStream Using zip As Ionic.Zip.ZipFile = New Ionic.Zip.ZipFile() zip.AddFile(sZipFileName, "") zip.Save(outputMemStream) End Using btResult = outputMemStream.ToArray() Return btResult


    Gracias, saludos!



    • Editado JeBusSoft miércoles, 24 de diciembre de 2014 19:29
    miércoles, 24 de diciembre de 2014 19:28
  • Que tal Ingenieros!

    Alguno de ustedes se topo con un error algo ambiguo que regresa el Web Service Envia enviaCONVOL(sFecha, sHora, zipBytes, sfinalString) usando el schema de la ultima version publicada 1.1 xmlns:controlesvolumetricos="http://www.sat.gob.mx/esquemas/controlesvolumetricos" 

    {"Internal Error"} System.Exception

    Anteriormente con el schema de la version 1.0 si regresaba los codigos de errores del contenido enviado en el XML.

    Saludos!


    lunes, 29 de diciembre de 2014 19:17
  • Que tal Ingenieros!

    En el proceso de transmisión el Web Service de pruebas me manda este error:

    <acceso clave='426' timestamp='30/12/2014 16:50:46' descripcion='Sellado de archivo no válido'></acceso>

    He verificado el sello con el siguiente comando:

    xsltproc cadenaoriginal_v1_1.xslt 0000000000E0000020141221.000000RFCI580401RFC.xml | openssl dgst -sha1 -sign RFCI580401RFC_S.key.pem | openssl enc -base64 -A

    El sello me sale igual como cuando genero el xml, por esta razón pienso que el sello es valido, pero en el portal de pruebas me rechaza el archivo por que me dice lo contrario.

    Alguna idea ?

    Agradezco de antemano.

    Saludos!
    miércoles, 31 de diciembre de 2014 5:41
  • Encontraste la solución a este problema?

    también lo tengo

    miércoles, 14 de enero de 2015 5:40
  • Ese error puede ser por varias razones

    Como que la cadena original no esté bien formada, que tenga un carácter invalido, etc.

    Pero en este caso yo creo que va a ser mas bien el Certificado que estas usando, probablemente no sea de la estación a la que quieres hacer el envío, el key y Cer no concuerden o que no tenga el dato correcto en Unidad o sucursal (Ej: E12345CV).

    Saludos!

    miércoles, 14 de enero de 2015 18:48
  • Una pregunta mas! que versión utilizan la versión 1.0 o la versión 1.1?
    viernes, 16 de enero de 2015 16:05
  • Hola que tal

    Al que le interese puedo darle una asesoria de como enviar correctamente los archivos, desde la generacion del xml hasta el envio, tanto en ambiente de pruebas como en producción. 

    Saludos 

    PD: no se porque publique y aparecio a nombre de otra persona (MigrationUser1)
    • Editado dvinci19 viernes, 23 de enero de 2015 0:49
    viernes, 23 de enero de 2015 0:47
  • Ese error puede ser por varias razones

    Como que la cadena original no esté bien formada, que tenga un carácter invalido, etc.

    Pero en este caso yo creo que va a ser mas bien el Certificado que estas usando, probablemente no sea de la estación a la que quieres hacer el envío, el key y Cer no concuerden o que no tenga el dato correcto en Unidad o sucursal (Ej: E12345CV).

    Saludos!

    Gracias por responder, efectivamente era lo del certificado en unidad o sucursal debe ser E12345CV.

    Saludos!!


    viernes, 23 de enero de 2015 19:45
  • Encontraste la solución a este problema?

    también lo tengo

    Hola que tal royervl!!

    Desafortunadamente, el portal de PEMEX manda un error generico tanto para la estructura del xml como la firma del mismo.

    para la estructura del xml te recomiendo usar

    http://www.freeformatter.com/xml-validator-xsd.html

    y en el campo Option 2: Or type in the URL to your XSD file coloca la  url:

    http://www.sat.gob.mx/fichas_tematicas/controles_volumetricos/Documents/controlesvolumetricos_v1_1.xsd

    para la firma

    te recomiendo que consideres lo siguiente:

    1. comprueba que el certificado tenga la estructura E12345CV. en widows, doble clic y en la pestalla detalles busca el campo sujeto, y da clic para que muestre en el campo de abajo los detalles, algo asi como

    OU = E01234CV  (al crear el CSD se debió haber puesto en el campo  Unidad o sucursal)
    SERIALNUMBER = XXXXXXXXXX
    2.5.4.45 = XXXXXXXXX
    O = XXXXXXXXXXX
    2.5.4.41 = XXXXXXXXXXXXXXX
    CN = XXXXXXXXXXXXXXXXXXX

    Nota: En OU el primer caracter  E siempre es fijo, 01234 es el numero de la estacion de servicio a 5 digitos y CV simpre es fijo.

    2. verifica que el .cer corresponda al key, yo los verifique en esta pagina:

    http://solucionfactible.com/sfic/capitulos/timbrado/CSD.jsp

    3. asegurate que el certificado este en la lista del SAT como activo.

    4. La fecha del archivo XML debe estar entre   la fecha de inicio de validacion del CSD hasta la fecha en que caduca.

    5. instala xsltproc y openssl para que te puedas auxiliar del siguiente comando.

    xsltproc cadenaoriginal_v1_1.xslt 0000000000E0000020141221.000000RFCI580401RFC.xml | openssl dgst -sha1 -sign RFCI580401RFC_S.key.pem | openssl enc -base64 -A

    Espero te sirva. Saludos!!




    viernes, 23 de enero de 2015 20:14
  • Alguien sabe si los servicios Web de Pemex tuvieron algún tipo de cambio? no eh podido realizar pruebas estos últimos dias y no eh podio contactar a la gente de Pemex,

    las Urls que yo tengo para hacer pruebas son:

    https://www.convolmiscelaneapruebas.pemex.com/ServiciosCVWEB/ServicioEnviaCONVOLService/ServicioEnviaCONVOLService.wsdl

    https://www.convolmiscelaneapruebas.pemex.com/ServiciosCVWEB/ServicioConsultaCONVOLService/WEB-INF/wsdl/ServicioConsultaCONVOLService.wsdl

    miércoles, 22 de julio de 2015 21:14