Documente Academic
Documente Profesional
Documente Cultură
Cmo... en .NET
Virtual Tree .NET Control Advanced data binding Fast virtual loading of data www.infralution.com Curso Visual Basic.net Aprende Cmoda y Rpidamente Desde Tu Casa. Infrmate aqu!
mexico.seas.es
Cursos diseo y animacin editorial,web, modelado,animacin photoshop, maya, 3dstudio, premiere kmmx.mx
Introduccin
S, ya se que si vamos a crear un c liente de Visual Basic 6.0, no debera estar en la secc in de .NET, pero... como de lo que se trata es de usar un Servic io Web c reado con un lenguaje de .NET Framework (en particular c on C#), pues c reo que "tambin" debera estar en esta secc in... De lo que se trata es de saber qu es lo que tenemos que hacer para poder c rear un c liente (una aplicacin) de Visual Basic clsico para poder usar un servicio Web creado c on .NET. Lo bueno de usar los servic ios Web es que al ac cederse a ellos mediante internet, no debe preoc uparnos si est hec ho en .NET o no... lo importante es que podemos usarlo y eso es lo que aqu vamos a ver:
17/01/2011
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.o <soap:Body> <CaF xmlns="http://elGuille/WebServices"> <valor>double</valor> </CaF> </soap:Body> </soap:Envelope>
Cuando mandemos este cdigo al servic io Web, tendremos que incluir en el sitio que est marc ado c on negrita (la palabra double) el valor del parmetro que queremos pasarle a esa func in. Esto lo haremos usando la clase DOMDocument del la librera msxml. El c digo sera algo as:
elguille.info//clienteVB6servicioWeb.htm
2/11
17/01/2011
Private Const cSOAPCaF = _ "<?xml version=""1.0"" encoding=""utf-8""?>" & _ "<soap:Envelope xmlns:xsi=""http:"//www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http:/ "<soap:Body>" & _ "<CaF xmlns=""http:"//elGuille/WebServices"">" & _ "<valor>1</valor>" & _ "</CaF>" & _ "</soap:Body>" & _ "</soap:Envelope>"
Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para CaF parser.loadXML cSOAPCaF ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/CaF/valor").Text = txtC.Text
Con esta ltima lnea lo que hacemos es asignar el parmetro que queremos pasarle a la func in CaF, la c ual espera un valor de tipo doble en un parmetro llamado valor. Una vez que tenemos el cdigo XML c on los datos a enviar al servicio Web, usaremos el Internet Transfer para hacer ese envo, de eso se encarga la siguiente lnea:
' Usar el control Inet para realizar la llamada al servicio Web Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml; charset=utf-8" & vbCrLf
Una vez que se haya ejecuta este comando, el servicio Web nos devolver la respuesta, (inc luso si se produc e algn error). Para recibir (e interpretar) la respuesta que nos mande el servicio Web, seguiremos usando el c ontrol Inet, en particular el evento StateChanged, veamos el cdigo:
elguille.info//clienteVB6servicioWeb.htm
3/11
17/01/2011
Private Sub Inet1_StateChanged(ByVal State As Integer) ' If (State = icResponseCompleted) Then ' icResponseCompleted = 12 Dim s As String ' ' Leer los datos devueltos por el servidor s = Inet1.GetChunk(4096) ' ' Poner los datos en el analizador de XML Dim parser As DOMDocument Set parser = New DOMDocument parser.loadXML s ' On Error Resume Next
Qu es lo que se hac e en este evento? Se comprueba si el estado del control es correc to (la desc ripcin del estado ic ResponseCompleted es: La solic itud se c omplet y se rec ibieron todos los datos), es decir, que si State vale 12 quiere decir que tenemos la respuesta del servidor, as que, leemos esos datos, se los pasamos al objeto XML para que nos resulte ms fc il interpretarlos y mostramos el resultado rec ibido en una caja de textos. Nota: Es importante detectar los errores, ya que si la cadena que se mand al servic io Web no es correcta, se produc ir un error al leer el valor, sobre todo si la cadena recibida no est en formato XML, c osa que oc urrir si, por ejemplo si en la direc cin indic ada no est el servic io Web, en este caso ser recibir una pgina "normal" de HTML indic ando que no se ha encontrado (el tpic o error 440). Y as a grandes rasgos esto es lo que nec esitamos para crear el cliente de VB6, poc a cosa verdad? El problema es saber qu c digo hay que usar para las llamadas a las distintas funciones, por suerte, si acc edemos a un servic io Web desde el explorer, ste nos mostrar una pgina c on lo necesario para crear el cdigo que nec esitamos. En la siguiente figura vers a qu me refiero:
elguille.info//clienteVB6servicioWeb.htm
4/11
17/01/2011
Figura 1, el cdigo SOAP para llamar a la funcin del servicio Web S, ya se que eso no es muy ac laratorio que digamos, pero... una vez que se sabe c mo "entenderlo", la c osa resulta ms fcil... yo, la verdad es que cuando vea ese cdigo, pues... c omo si nada... pero, por suerte, cay en mis manos un libro en el que, si bien no se explica a fondo c mo hac er esto, en la web del mismo s que se inclua un ejemplo, el cual me ha servido para hacer este que te muestro hoy... que no te c reas que yo me lo se todo... que tambin leo a otros autores..., en este caso es David S. Platt y su libro Introducing .NET (que me lo mandaron la gente de MSDN Latinoamrica al c onseguir la primera estrella del desarrollador 5 estrellas, que todo hay que decirlo). Bueno, te dejo el cdigo completo, as como una c aptura del formulario adems de, por supuesto, dejarte en un zip el cdigo de ejemplo. La captura del formulario de ejemplo:
elguille.info//clienteVB6servicioWeb.htm
5/11
17/01/2011
El link al c digo completo (se incluye el fic hero del servic io Web y el fichero WSDL) ClienteVB6CF.zip 10.20 KB
Nos vemos. Guillermo P.S. Rec uerda que dentro de poco publicar el c digo genric o para acc eder a c ualquier servicio Web. En ese ejemplo, mostrar la forma de crear una serie de colecc iones con las distintas funciones que e incluyen en el servic io Web as como cada uno de los parmetros que rec ibe c ada una de las funciones. Pero eso ser en unos das... o lo mismo maana... quin sabe?
' Estas definiciones estn tomadas de lo mostrado en el explorador ' al seleccionar cada una de las funciones del servicio Web Private Const cSOAPCaF = _ "<?xml version=""1.0"" encoding=""utf-8""?>" & _ "<soap:Envelope xmlns:xsi=""http:"//www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http:/ "<soap:Body>" & _ "<CaF xmlns=""http:"//elGuille/WebServices"">" & _ "<valor>1</valor>" & _ "</CaF>" & _ elguille.info//clienteVB6servicioWeb.htm 6/11
17/01/2011
Cmo... Cmo usar un servicio Web XM "</CaF>" & _ "</soap:Body>" & _ "</soap:Envelope>"
Private Const cSOAPFaC = _ "<?xml version=""1.0"" encoding=""utf-8""?>" & _ "<soap:Envelope xmlns:xsi=""http:"//www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http:/ "<soap:Body>" & _ "<FaC xmlns=""http:"//elGuille/WebServices"">" & _ "<valor>1</valor>" & _ "</FaC>" & _ "</soap:Body>" & _ "</soap:Envelope>"
Private Sub cmdC2F_Click() tipo = deCaF Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para CaF parser.loadXML cSOAPCaF ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/CaF/valor").Text = txtC.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' Usar el control Inet para realizar la operacin HTTP POST Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml; charset=utf-8" & vb End Sub
Private Sub cmdF2C_Click() tipo = deFaC Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para FaC parser.loadXML cSOAPFaC ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/FaC/valor").Text = txtF.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' Usar el control Inet para realizar la operacin HTTP POST Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml; charset=utf-8" & vb End Sub Private Sub Form_Load() Text1.Text = "Cliente VB6" & vbCrLf & "del Servicio Web Conversor de C a F" End Sub Private Sub Inet1_StateChanged(ByVal State As Integer) ' If (State = icResponseCompleted) Then ' icResponseCompleted = 12 Dim s As String ' ' Leer los datos devueltos por el servidor s = Inet1.GetChunk(4096) Text1.Text = s ' ' Poner los datos en el analizador de XML Dim parser As DOMDocument Set parser = New DOMDocument parser.loadXML s ' On Error Resume Next
elguille.info//clienteVB6servicioWeb.htm
7/11
17/01/2011
Cmo... Cmo usar un servicio Web XM ' If tipo = deCaF Then txtF.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/CaFResponse/CaFResult Else txtC.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/FaCResponse/FaCResult End If ' If Err.Number > 0 Then Text1.SetFocus End If End If End Sub
Este es el c digo usado para c rear el servic io Web. Estar dentro de un fichero llamado Conversor.asmx el c ual tendr que estar copiado en una carpeta del servidor Web loc al (si tu intencin es probarlo sin estar c onec tado a Internet). <%@ WebService Language="c#" Class="CelsiusFahrenheit.Conversor" %> using System.Web.Services; namespace CelsiusFahrenheit { /// /// Descripcin breve de Conversor. /// [WebService(Namespace="http:"//elGuille/WebServices", Description="Conversor de grados Fahrenheit a grados centgrados (Celsius)")] public class Conversor { // const double fc = (5.0 / 9.0); // [WebMethod(Description="Convierte de Fahrenheit a Celsius, devuelve un valor Double")] public double FaC(double valor) { return ((valor - 32) * fc); } [WebMethod(Description="Convierte de Celsius a Fahrenheit, devuelve un valor Double")] public double CaF(double valor) { return (valor / fc + 32); } // } }
Modificacin para NO usar el Internet Transfer Control para acceder al servicio Web (29/Jun/03) En el ejemplo que te mostr arriba, se utiliza el control INET (Internet Transfer Control) para acc eder al servicio Web, tanto para enviar los datos c omo para rec ibirlos, pero si no quieres no hac e falta ya
elguille.info//clienteVB6servicioWeb.htm
8/11
17/01/2011 Cmo... Cmo usar un servicio Web XM que el Microsoft XML version 2.0 incluye un objeto para poder hacer esta tarea, se trata de XMLHTTPRequest. Este objeto contiene una serie de mtodos que nos permite enviar un c omando al servicio Web para mandarle la informac in y tambin nos permite rec ibir los datos que el servic io Web nos enva.
Veremos el cdigo que habra que c ambiar para que func ione el proyecto para acc eder al servicio Web conversor de temperaturas. Lo primero que no nec esitamos es el control Inet, por tanto puedes quitarlo del formulario, as como la referencia que tenemos (en Proyec to/Componentes...). Tambin puedes quitar el evento Intet1_Statechanged ya que no lo necesitaremos. Aqu (dentro de unas lneas) te voy a mostrar el nuevo c digo. Lo primero que tendrs que hac er es sustituir el cdigo de los eventos Clic k de los dos botones de c onversin, adems de aadir un par de nuevos proc edimientos para enviar y recibir la informac in del servicio Web. Aunque antes te voy a explic ar un poco c mo funciona el objeto XMLHTTPRequest y cmo usarlo. Cuando enviamos un c omando POST (ahora veremos c mo), se enva el c omando al servicio Web (igual que hac amos con el control Inet) y el servicio Web nos devolver una respuesta, esa respuesta tendr que proc esarla tambin el objeto XMLHTTPRequest. Como puede ser que la respuesta tarde en llegar, se podra hac er que se nos notificara c uando esa respuesta llegue (forma asnc rona) o tambin podemos esperar hasta que la respuesta llegue y despus continuar (forma sncrona). Esta ltima ser la forma que vamos a utilizar, ya que la otra (la asncrona) necesita algo de ms cdigo e incluso la creacin de una clase, que sera la que rec ibiera la notific ac in de que se ha terminado de rec ibir los datos desde el servidor. Nota: Si quieres ver cmo se hac e esto ltimo te rec omiendo que te bajes el Microsoft XML 4.0 Parser SDK y en la documentacin est c mo hac erlo, (este otro link te llevar a la doc umentac in de MSXML 4.0 SDK en lnea y en ingls). Si tienes la documentacin del mencionado SDK puedes buscar estos temas: Use the onReadyStateChange Property (Visual Basic) Make XML Requests Over HTTP (Visual Basic) Program with DOM in Visual Basic Bueno, ahora si vamos a ver el cdigo. Si quieres bajarte el cdigo ya "hec ho", pulsa este link. ClienteVB6CF2.zip 8.91 KB El c digo de los dos eventos Click (este c digo tendrs que reemplazarlo del c digo mostrado anteriormente)
elguille.info//clienteVB6servicioWeb.htm
9/11
17/01/2011
Private Sub cmdC2F_Click() tipo = deCaF ' Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para CaF parser.loadXML cSOAPCaF ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/CaF/valor").Text = txtC.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' ' enviarComando parser.xml, "http:"//elGuille/WebServices/CaF" ' End Sub Private Sub cmdF2C_Click() tipo = deFaC ' Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para FaC parser.loadXML cSOAPFaC ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/FaC/valor").Text = txtF.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' ' enviarComando parser.xml, "http:"//elGuille/WebServices/FaC" ' End Sub
El nuevo cdigo para enviar el comando al servic io Web y el que proc esa el cdigo rec ibido del servic io Web.
elguille.info//clienteVB6servicioWeb.htm
10/11
17/01/2011
Private Sub enviarComando(ByVal sXml As String, ByVal sSoapAction As String) ' Enviar el comando al servicio Web ' ' usar XMLHTTPRequest para enviar la informacin al servicio Web Dim oHttReq As XMLHTTPRequest Set oHttReq = New XMLHTTPRequest ' ' Enviar el comando de forma sncrona (se espera a que se reciba la respuesta) oHttReq.open "POST", txtURL.Text, False ' las cabeceras a enviar al servicio Web ' (no incluir los dos puntos en el nombre de la cabecera) oHttReq.setRequestHeader "Content-Type", "text/xml; charset=utf-8" oHttReq.setRequestHeader "SOAPAction", sSoapAction ' enviar el comando oHttReq.send sXml ' ' este ser el texto recibido del servicio Web procesarRespuesta oHttReq.responseText ' End Sub
Private Sub procesarRespuesta(ByVal s As String) ' procesar la respuesta recibida del servicio Web Text1.Text = s ' ' Poner los datos en el analizador de XML Dim parser As DOMDocument Set parser = New DOMDocument parser.loadXML s ' On Error Resume Next ' If tipo = deCaF Then txtF.Text = "Error" txtF.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/CaFResponse/CaFResult").T Else txtC.Text = "Error" txtC.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/FaCResponse/FaCResult").T End If ' If Err.Number > 0 Then Text1.SetFocus End If End Sub
Si observas los cambios, te dars c uenta que usando el objeto XMLHTTPRequest tenemos que indicar las c abeceras enviadas al servic io Web se indic a usando el mtodo setRequestHeader y el c digo XML se enva c on el mtodo send. En fin... espero que ahora sepas otra forma de c omunicarte con un servic io Web XML creado c on .NET Nos vemos. Guillermo
elguille.info//clienteVB6servicioWeb.htm
11/11