(Ejemplo 4 del artículo Interoperabilidad VFP y .NET)
Este escrito tiene como objetivo servir de guía paso a paso sobre cómo realizar la conexión entre estas dos herramientas para desarrollo de aplicaciones que son: Visual FoxPro y VS.NET. En este caso creamos un Servicio Web en .NET y lo consumimos en VFP.
Consumir en VFP Servicios Web creados en .NETPor Amby
(Ejemplo 4 del artículo Interoperabilidad VFP y .NET) En .NET creamos una nueva solución seleccionando Servicio Web Al crear un proyecto WS ASP.Net, el IDE de VS.Net incluye automáticamente todas las referencias requeridas y crea un archivo de código fuente de WS, con una plantilla con el código "Hola mundo" 
Seleccionamos haga clic aquí para cambiar a la vista de códigos y escribimos un método que devuelva la Hora actual. Imports System.Web.Services
<System.Web.Services.WebService(Namespace := "http://tempuri.org/WebService2/Service1")> _
Public Class Service1
Inherits System.Web.Services.WebService
#Region " Código generado por el Diseñador de servicios Web "
.... código escrito por el framework de .NET
#End Region
' EJEMPLO DE SERVICIO WEB
' El servicio de ejemplo HelloWorld() devuelve la cadena Hello World.
' Para generar, quite los comentarios de las siguientes líneas y, a continuación, guarde y genere el proyecto.
' Para probar este servicio Web, compruebe que la página de inicio es el archivo .asmx
' y presione F5.
'
'<WebMethod()> Public Function HelloWorld() As String
' HelloWorld = "Hello World"
' End Function
<WebMethod()> Public Function DameHoraActual() As DateTime
Return DateTime.Now
End Function
End ClassLo único diferente para los desarrolladores VFP es <WebMethod()> Este atributo dice al motor de ejecución de ASP.Net que este método será expuesto a través de un WS acorde con el estándar SOAP basado en XML para el paso de mensajes de peticiones y respuestas de WS. Para ejecutar el WS basta con oprimir F5 para ver el test 
En este ejemplo, el servicio expone un único método, hacemos clic en DameHoraActual 
Hacemos Clic en Invocar para ejecutar el servicio. Si el Servicio Web requiere de parámetros se van a mostrar cuadros de texto para introducirlos. El valor devuelto por el método está envuelto en un XML que es el mecanismo clave que permite llamar este WS desde VFP 
Bien, ya tenemos un Servicio Web que funciona, ahora veamos cómo lo podemos registrar y consumir desde VFP. Para ello vamos a utilizar la excelente herramienta Panel de tareas – Task Pane que se introdujo en VFP 8.0 y entre sus múltiples ventajas y paneles nos detendremos en la ficha XML Web Services. 
Hacemos Clic en Register an XML WS 
Debemos especificar la URL que describe el WS y dice a VFP qué métodos así como los parámetros y valores de retorno del WS. Los WS basados en ASP.Net proporcionan una URL WSDL (WS Description Languaje), esta URL proporciona precisamente esta información. Podemos encontrar esta URL lanzando nuevamente el test y haciendo clic en el enlace Descripción de servicios 
Copiamos y pegamos en la ventana de VFP 
En condiciones reales, no hay que olvidar cambiar localhost por el nombre del dominio donde reside el WS. Después de registrarlo 
Se puede comprobar desde el mismo Task Pane 
Hacemos Clic en el icono que aparece al lado del nombre del servicio que queremos verificar y aparece esta pantalla 
Ahora sabemos que funciona en VFP y ya podemos utilizarlo en un programa de VFP, para esto necesitamos código; pero la buena, buenísima noticia es que el panel de tarea también nos proporciona ese código, se puede arrastrar y pegar directamente en una ventana de código. En el ejemplo se incluye hasta el tratamiento de errores, hay que prestar atención a estas dos líneas LOCAL loService1 AS "XML Web Service"
* LOCAL loService1 AS "MSSOAP.SoapClient30"
* Do not remove or alter following line. It is used to support IntelliSense for your XML Web service.
*__VFPWSDef__: loService1 = http://localhost/WebService2/Service1.asmx?WSDL , Service1 , Service1Soap
LOCAL loException, lcErrorMsg, loWSHandler
TRY
loWSHandler = NEWOBJECT("WSHandler",IIF(VERSION(2)=0,"",HOME()+"FFC\")+"_ws3client.vcx")
loService1 = loWSHandler.SetupClient("http://localhost/WebService2/Service1.asmx?WSDL", ;
"Service1", "Service1Soap")
* Call your XML Web service here. ex: leResult = loService1.SomeMethod()
lwsHoraActual = loService1.DameHoraActual()
MESSAGEBOX(loService1.DameHoraActual)
CATCH TO loException
lcErrorMsg="Error: "+TRANSFORM(loException.Errorno)+" - "+loException.Message
DO CASE
CASE VARTYPE(loService1)#"O"
* Handle SOAP error connecting to web service
CASE !EMPTY(loService1.FaultCode)
* Handle SOAP error calling method
lcErrorMsg=lcErrorMsg+CHR(13)+loService1.Detail
OTHERWISE
* Handle other error
ENDCASE
* Use for debugging purposes
MESSAGEBOX(lcErrorMsg)
FINALLY
ENDTRY Cambiamos esas líneas de programa y vemos como muestra IntelliSense 
Lo ejecutamos y vemos el resultado. 
El ejemplo de código instancia el objeto WSHandler, que es el conector de VFP al WS. Este objeto se configura luego con la URL WSDL. Luego el método, en este caso, DameHoraActual que devuelve una variable DateTime de .Net. VFP automáticamente asigna el valor devuelto a una variable DateTime, a pesar que los dos formatos FechaHora son algo diferentes internamente. Teniendo en cuenta que sabemos el tipo de dato que devuelve podemos realizar operaciones como: MESSAGEBOX(loService1.DameHoraActual())
ldHoraActual = loService1.DameHoraActual
MESSAGEBOX(TTOC(ldHoraActual,2)) Esto no siempre es tan fácil, en ocasiones puede devolver datos que no sean nativos de VFP, por ejemplo, cuando el valor devuelto es un objeto complejo como un DataSet de ADO, para ello recordar que existe la clase XMLAdapter desde VFP 8.0 que se encarga de manipular los XML. Espero que haya resultado de utilidad. Saludos, Ana María Bisbé York www.amby.net
|