Ir al contenido


Foto

Problema con certificado al invocar webservice


  • Por favor identifícate para responder
16 respuestas en este tema

#1 javi@techni-web.es

javi@techni-web.es

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 16 julio 2012 - 09:17

He visto algún post en este foro que tiene relación con mi problema, pero me decido a poner un nuevo tema porque no encuentro exáctamente que es lo que hago mal al consumir un webservice.

El caso es que mapeo el wsdl en Delphi7 utilizando el famoso asistente que te crea un .pas con todas las funciones,  a la hora de invocar una de las funciones me salta un access violation y por mas que he investigado no se que me falte...

He leído algún comentario sobre instalar el certificado del webservice en el IE, pero lo hice y no veo que cambie algo... Ojalá algún alma caritativa me pueda ayudar.

este es el wsdl al que intento enviarle un XML -> https://cfdiws.sedeb...vices/CFDi?wsdl


Este es el código desde donde invoco una de las funciones del wsdl



delphi
  1. procedure TFXMLFac.SBElectronicaClick(Sender: TObject);
  2. var CabeceraNode,XMLNode: IXMLNode;
  3. Res1 : TByteDynArray;
  4. Res2 : TByteDynArray;
  5. Res3 : TByteDynArray;
  6. factXML : Variant;
  7. usuario, pwd : WideString;
  8. begin
  9.  
  10.   usuario := 'demo';
  11.   pwd    := 'demo';
  12.  
  13.   CabeceraNode := XMLGenerarFacturaElectronica (XMLDocument, Now, '', DCapGen, DLingen );
  14.   showmessage (ERuta.text+DCapGen.fieldbyname ('serie').asstring+DCapGen.fieldbyname ('numero').asstring+'_'+'.xml');
  15.   XMLDocument.SaveToFile (ERuta.text+DCapGen.fieldbyname ('serie').asstring+DCapGen.fieldbyname ('numero').asstring+'_'+'.xml');
  16.  
  17.   Res1 := StringToByteArray (XMLDocument.XML.Text);
  18.  
  19.   try
  20.       Res2 := getcfdi.getCfdiTest (usuario, pwd, Res1);
  21.   except
  22.     raise exception.create(CFDiException.ClassName);
  23.   end;
  24.  
  25. end;



esta es la función que encontré para pasar el contenido del xml a formato TByteDynArray



delphi
  1. function TFXMLFac.StringToByteArray(const Str: string): TByteDynArray;
  2. var
  3.   MSTream: TMemoryStream;
  4.   pTemp: pointer;
  5. begin
  6.   MStream := TMemoryStream.Create;
  7.   MStream.Write(str,length(str));
  8.   MStream.Position := 0;
  9.  
  10.   SetLength(Result, MStream.Size);
  11.   pTemp := @Result[0];
  12.   MStream.Position := 0;
  13.   MStream.Read(pTemp^, MStream.Size);
  14.  
  15.   MStream.Free;
  16. end;



Espero que mi primer post sea bien recibido y si no está en buen lugar espero un buen trato del moderador :)

  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 16 julio 2012 - 10:34

Hola javi@techni-web.es,
¡Bienvenido a DelphiAccess! Espero que te sientas muy a gusto en esta comunidad.

Yo de webservices no tengo idea pero hay gente aquí que lo domina, no desesperes y pronto tendrás respuestas.
Me tomé la libertad de editar tu mensaje para corregir las etiquetas CODE por las de DELPHI a fin de que el código esté bien formateado. Mas info sobre el uso de las etiquetas aquí.

Saludos,
  • 0

#3 javi@techni-web.es

javi@techni-web.es

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 16 julio 2012 - 11:25



Gracias Delphius, te agradezco la aclaración. Espero alguna respuesta y seguir colaborando por aquí....

Un saludo
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 21 julio 2012 - 06:45

Hola Javi.

Un Access Violation siempre es un error problemático, puesto que no da mucha información. Personalmente aún no me ha ocurrido al pelearme con los WebServices.

Te recomiendo que instales un gestor de errores de Delphi, en concreto el MadExcept, y que mires los datos que te da ese gestor cuando salta el error (puedes subirlos aquí e intentaremos ayudarte a interpretarlos).

http://madshi.net/ma...Description.htm

No estoy seguro de que tu problema sea que te falte un certificado de seguridad. Yo tuve que usar un WebService que precisaba tener instalado su certificado correspondiente y no me saltaba un Access Violation, sino que saltaba un error común en el que se informaba de que el XML que devolvía el WebService estaba vacío (bueno, era un poco más críptico que eso, y decía que el nodo 0 no era correcto, o algo así, aunque eso ya me orientó lo suficiente como para darme cuenta que el XML que estaba recibiendo estaba vacío).

Saludos.
  • 0

#5 javi@techni-web.es

javi@techni-web.es

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 22 julio 2012 - 10:36


Hola Marc, antes de nada muchísimas gracias por tu respuesta, para empezar la verdad es que si me faltaba un certificado, ese podría ser uno de los problemas... aunque mi problema continúa

Exporté el certificado de la siguiente forma

Click en el candado al lado derecho de la barra de direcciones de IE7 al tener el wsdl en el browser.
2. Aparece un menu emergente "Identificacion del sitio web", click en "Ver certificados"
3. Aparece una ventana modal que dice "Certificado"
4. Click en la pestaña "Detalles"
5. Click en el boton "Copiar en archivo..."
6. Se abre el "Asistente para exportacion de certificados"
7. Click en "Siguiente", Seleccionar "DER binario codificado X.509  (.CER)", click en "Siguiente"
8. Click en "Examinar", Digite el nombre del certificado y la carpeta  donde lo va a almacenar, click en "Guardar"
9. Click en "Siguiente"
10. Click en "Finalizar"

Después instalé el certificado con este enlace

http://support.micro...om/kb/931850/es


Sigo teniendo el error access violation

Instalé el MadExcept y aunque no me sirvió de mucho a mi te pongo lo que me apareció... :s

____________________________________________________________________________
thread $d04:
77b45aea +0a ntdll.dll    NtWaitForMultipleObjects
76921112 +10 kernel32.dll  BaseThreadInitThunk

thread $1328:
77b45b1a +0a ntdll.dll    NtWaitForWorkViaWorkerFactory
76921112 +10 kernel32.dll  BaseThreadInitThunk

thread $bdc:
77b45b1a +0a ntdll.dll    NtWaitForWorkViaWorkerFactory
76921112 +10 kernel32.dll  BaseThreadInitThunk

thread $590:
77b448ba +0a ntdll.dll                    NtDelayExecution
75e01870 +4f KERNELBASE.dll              SleepEx
75e01813 +0a KERNELBASE.dll              Sleep
00454559 +0d ProjectFactXML.exe madExcept CallThreadProcSafe
004545c3 +37 ProjectFactXML.exe madExcept ThreadExceptFrame
76921112 +10 kernel32.dll                BaseThreadInitThunk
>> created by main thread ($2b8) at:
769227b8 +1b kernel32.dll                CreateThread

thread $103c:
77b45b1a +0a ntdll.dll    NtWaitForWorkViaWorkerFactory
76921112 +10 kernel32.dll  BaseThreadInitThunk

thread $ab8:
77b45b1a +0a ntdll.dll    NtWaitForWorkViaWorkerFactory
76921112 +10 kernel32.dll  BaseThreadInitThunk
____________________________________________________________________________


¿Alguna idea?




  • 0

#6 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 julio 2012 - 03:10

Buenos días Javi,

Sigo teniendo el error access violation

Instalé el MadExcept y aunque no me sirvió de mucho a mi te pongo lo que me apareció... :s


No parece muy informativo ese error. :)

Vete al menú Project de Delphi y entra en MadExcept Options. Allí, en Bug Report activa todas las opciones para que te haga un informe más detallado y que nos pueda ayudar a detectar el problema.

Saludos.
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 23 julio 2012 - 04:28

Parece por lo poco que dice MadExcept que tiene que ver con hilos y su acceso concurrente a "algo"...

Yo tuve un problema similar, al programar un servidor web integrado en mi aplicación, usaba componentes "normales" para acceder a los datos, y estos eran compartidos por todas las sesiones, y eso no se puede hacer si el componente no esta preparado para trabajar en multihilo, y casi ninguno lo está.

Podría ser esto, acceso a base de datos desde el hilo del webservice, o podría ser otra cosa similar.

En mi caso "serialize" en una cola los accesos complejos a estos DataSet, y las consultas puntuales que necesitaba las hacia con unified interbase (UIDB) que son simples pero multihilo.

Marc lo resuelve -corrigeme Marc si meto la pata- usando ClientDataSet, que serializa todos los acceso a datos de forma "natural" y evita el problema igualmente.
  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 julio 2012 - 05:27

Marc lo resuelve -corrigeme Marc si meto la pata- usando ClientDataSet, que serializa todos los acceso a datos de forma "natural" y evita el problema igualmente.


Vaya, no sabía eso Sergio. Utilizo por sistema ClientDatasets en todos los accesos a bases de datos porqué me encanta la potencia de ese componente (opciones de filtrado adicionales, campos de agregado, campos internos, desconexión de la base de datos, ...). No sabía que me estuviese ahorrando problemas de concurrencia.

Gracias por el aviso. :)
  • 0

#9 javi@techni-web.es

javi@techni-web.es

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 23 julio 2012 - 06:37


Hola Marc.

Tienes razón que no es muy informativo, una disculpa de verdad, pero he activado lo que me comentas y no tengo mas información, el MadExcept sigue devolviendo lo mismo  :undecided:

Sigo sin ver lo que hago mal no se si por el certificado o por alguna otra razón pueda devolver este error Delphi.

Gracias.
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 23 julio 2012 - 07:36

......Marc lo resuelve -corrigeme Marc si meto la pata- usando ClientDataSet, que serializa todos los acceso a datos de forma "natural" y evita el problema igualmente....


Siempre he usado ClienDataSet en mis webservice y no he tenido problemas de acceso, muy interesante dato Sergio. (y)

Saludos
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 julio 2012 - 12:03


......Marc lo resuelve -corrigeme Marc si meto la pata- usando ClientDataSet, que serializa todos los acceso a datos de forma "natural" y evita el problema igualmente....


Siempre he usado ClienDataSet en mis webservice y no he tenido problemas de acceso, muy interesante dato Sergio. (y)

Saludos


y que componentes usas para acceso a datos?
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 23 julio 2012 - 12:05



......Marc lo resuelve -corrigeme Marc si meto la pata- usando ClientDataSet, que serializa todos los acceso a datos de forma "natural" y evita el problema igualmente....


Siempre he usado ClienDataSet en mis webservice y no he tenido problemas de acceso, muy interesante dato Sergio. (y)

Saludos


y que componentes usas para acceso a datos?


Utilizo dbExpress principalmente, pero también utilizo IBX.

Saludos
  • 0

#13 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 julio 2012 - 12:18




......Marc lo resuelve -corrigeme Marc si meto la pata- usando ClientDataSet, que serializa todos los acceso a datos de forma "natural" y evita el problema igualmente....


Siempre he usado ClienDataSet en mis webservice y no he tenido problemas de acceso, muy interesante dato Sergio. (y)

Saludos


y que componentes usas para acceso a datos?


Utilizo dbExpress principalmente, pero también utilizo IBX.

Saludos


Yo tengo el mio del lado del Server:

TibDatabase - TIbTransaction - TIbQuery - TDataSetProvider


En el lado cliente

TSoapConnection - ClientDataset


Esta bien esa configuración? alguien ha tenido experiencia al respecto???

SAludos




  • 0

#14 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 julio 2012 - 01:12

Utilizo dbExpress principalmente, pero también utilizo IBX.

Saludos


Yo utilizo dbExpress y FibPlus.

Saludos.
  • 0

#15 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 julio 2012 - 01:17


Hola Marc.

Tienes razón que no es muy informativo, una disculpa de verdad, pero he activado lo que me comentas y no tengo mas información, el MadExcept sigue devolviendo lo mismo  :undecided:

Sigo sin ver lo que hago mal no se si por el certificado o por alguna otra razón pueda devolver este error Delphi.

Gracias.


Lo siento Javi, no sé que más puedes hacer y con los datos de MadExcept no veo de donde puede venir el problema. La verdad es que nunca he usado un WebService que necesite un XML como parámetro.

Las referencias a Kernel32.dll y ntdll.dll aparecen por las llamadas al API de Windows que resultan de tu aplicación. ¿ Puedes probar el ejecutable en otro ordenador, a ver si hay algo mal en el Sistema Operativo de ese equipo ?.

La referencia a ProjectFactXML.exe indica que podría ser un problema en la construcción del archivo XML. ¿ Puedes hacer la prueba enviando un XML ya construido manualmente antes y que sabes que es correcto ?.

Saludos.
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 23 julio 2012 - 01:25



Hola Marc.

Tienes razón que no es muy informativo, una disculpa de verdad, pero he activado lo que me comentas y no tengo mas información, el MadExcept sigue devolviendo lo mismo  :undecided:

Sigo sin ver lo que hago mal no se si por el certificado o por alguna otra razón pueda devolver este error Delphi.

Gracias.


Lo siento Javi, no sé que más puedes hacer y con los datos de MadExcept no veo de donde puede venir el problema. La verdad es que nunca he usado un WebService que necesite un XML como parámetro.

Saludos.


Lo que yo creo es que el problema con el XML es la serialización, ¿puedes colocar el cuerpo del XML que se recibe/envía? no importan los datos sino los nodos, es un tema que me costó trabajo resolver y lo solucioné con una verdadera chapuza...... :(

Saludos

  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 23 julio 2012 - 01:44

Caray, me parece que ya debo darle acelere al tutorial para depurar un webService, sólo así se podrá saber a ciencia cierta donde está el problema, ya hice las pruebas y funciona excelente, ahora es el tiempo que no tengo para armar algo que se agradezca, me parece que lo liberaré con un ejemplo muy sencillo y después ya nos meteremos en algo más complejo.

Saludos
  • 0




IP.Board spam blocked by CleanTalk.