Anda di halaman 1dari 21

Marco Besteiro y Miguel Rodrguez Clases

1/21 1
Web Services.

Un servicio Web o WebService es un servicio ofrecido por una aplicacin que expone
su lgica a clientes de cualquier plataforma mediante una interfaz accesible a travs de
la red utilizando tecnologas (protocolos) estndar de Internet.

Por ejemplo, una aplicacin como Access est formada por un conjunto de componentes
que ofrecen una serie de servicios, como el acceso a datos, la impresin de informes, el
diseo de tablas...

La idea de los servicios es la misma, aunque stos no tienen por qu estar en el mismo
ordenador que el cliente y adems son accedidos a travs de un servidor Web y de un
modo independiente de la plataforma, utilizando protocolos estndar (HTTP, SOAP,
WSDL, UDDI).


Figura 23.1 Pila de protocolos de los WebServices.

Para crear un servicio puede utilizarse cualquiera de los lenguajes disponibles en la
plataforma .NET.

Una vez creado el servicio, para conseguir que sea accesible por los consumidores, es
necesario describirlo utilizando un lenguaje estndar llamado WSDL (Web Service
Description Language).

Los clientes del servicio podrn estar creados en cualquier lenguaje y ejecutarse sobre
cualquier sistema operativo y hardware, lo nico necesario es que sean capaces de
obtener y entender la descripcin WSDL de un servicio.

Marco Besteiro y Miguel Rodrguez Clases
2/21 2
Un archivo WSDL es, en realidad, un archivo XML en el que se identifica el servicio y
se indica el esquema para poder utilizarlo, as como el protocolo o protocolos que es
posible utilizar.

Una vez dispone de esta informacin, el cliente puede comunicarse con el servicio
utilizando protocolos como HTTP o SOAP (SOAP aade invocacin de mtodos a
HTTP, aunque es posible hacerlo con peticiones HTTP-GET y/o HTTP-POST en lugar
de SOAP).

Adems de describir un servicio para que pueda ser utilizado por los clientes es
importante publicar el servicio de modo que pueda ser encontrado por clientes que no
conozcan necesariamente el componente que ofrece el servicio, pero que busquen un
servicio de sus caractersticas. Esto se logra mediante el estndar UDDI (Universal
Description, Discovery and Integration Registry). Realmente se trata de un servicio
mundial en el que los proveedores de servicios pueden registrarlos de modo gratuito.


Figura 23.2 Creacin, registro, bsqueda y utilizacin de un WebService.

Por qu tantos protocolos?
Actualmente, al publicar un documento en un servidor web apenas es necesario tener en
cuenta las caractersticas del cliente (S.O., hardware, aplicaciones...). Esto es posible
gracias a que HTML y HTTP son un estndar mundial de diseo, solicitud y
transmisin de documentos. De este modo, el servicio web (www) es universal, es decir,
accesible desde cualquier cliente.

Para conseguir algo similar con los WebServices, Microsoft, IBM y otras empresas han
estado y estn definiendo los protocolos comentados, los cuales permitirn describir un
servicio, publicarlo de modo que los clientes puedan localizarlo y utilizarlo...

A continuacin se comentan brevemente algunas alternativas a los protocolos
comentados:

- En el caso de HTTP y SOAP otras opciones (en este caso sustitutivas y/o
complementarias) son:
Marco Besteiro y Miguel Rodrguez Clases
3/21 3
o J abber, es un protocolo asncrono de transporte (ms ligero que HTTP).
o EbXML, est pensado para integracin de servicios en soluciones B2B
(Business to Business).
o XML-RPC, est basado en HTTP-POST.
- En el caso de WSDL otras opciones son:
o RDF (Resource Description Framework), definido por el W3C. Es ms
potente pero tambin ms complejo que WSDL.
o DAML (DARPA Agent Markup Language), definido por la agencia de
defensa estadounidense (DARPA). Es tambin ms potente pero ms
complejo que WSDL.
- En el caso de UDDI existe una propuesta alternativa realizada por Microsoft e
IBM, llamada WS-Inspection Language.

Ventajas de los Web Services.
Entre las ventajas ms importantes que ofrecen los WebServices se pueden citar:
- Ofrecen una tecnologa distribuida de componentes optimizada.
- Evitan los problemas inherentes a la existencia de firewalls, ya que SOAP utiliza
HTTP como protocolo de comunicacin.
- Permiten una invocacin sencilla de mtodos, mediante SOAP.
- Los clientes o consumidores de servicios pueden estar en cualquier plataforma
(basta con que soporten XML/SOAP, incluso puede sustituirse SOAP por
HTTP).
- Permiten centralizar los datos, independientemente de si los WebServices estn
distribuidos o no.

Estructura de un Servicio Web.
Todo Servicio Web ha de implementarse mediante una clase derivada de la clase Web
Service, que pertenece al namespace Syst em. Web. Ser vi ces.

Ninguno de los mtodos de esta clase, ya sean privados, protegidos o pblicos ser
accesible para un cliente o consumidor del servicio. Si se desea que un mtodo sea
accesible desde un cliente, debe ser definido con el atributo [ WebMet hod] .

Al igual que los WebForms, un Web Service o servicio Web se compone de dos
ficheros (los ms importantes, aunque realmente son ms):

- Un fichero con extensin . asmx: equivale al fichero . aspx de las pginas
ASP.NET (WebForms). Es la pgina que se pedir desde el navegador del
cliente para acceder al servicio.
- Un fichero . cs: Contiene el cdigo del servicio (equivale al .cs de las pginas
ASP.NET).

Creacin de un Web Service.
Es posible crear un Web Service escribiendo todo el cdigo o bien utilizando Visual
Studio. En este caso se van a mostrar los pasos para hacerlo mediante Visual Studio.

Marco Besteiro y Miguel Rodrguez Clases
4/21 4
- El primer paso es crear un proyecto de tipo Web Service (se llamar
Hol aI nt er net Ser vi ce):



Figura 23.3. Cuadro de dilogo Nuevo Proyecto. Creacin de un Web Service.

Al pulsar OK se crean 3 ficheros:

1) Ser vi ce1. asmx

Para ver el contenido del fichero Ser vi ce1. asmx:
- Pulsar el botn derecho del ratn sobre Ser vi ce1. asmx en el explorador de
soluciones.
- En el men contextual elegir Abrir con.
- En el cuadro de dilogo que se muestra, elegir Editor de cdigo fuente (Texto):

Marco Besteiro y Miguel Rodrguez Clases
5/21 5


Figura 23.4. Cuadro de dilogo Abrir con. La opcin Editor de cdigo fuente
permitir ver el contenido del fichero . asmx.

El contenido es:

<%@ WebSer vi ce Language=" c#" Codebehi nd=" Ser vi ce1. asmx. cs"
Cl ass=" Hol aI nt er net Ser vi ce. Ser vi ce1" %>

Ser vi ce1. asmx es la pgina que pedir un usuario desde un navegador. sta invoca al
cdigo del servicio, que se encuentra en el fichero indicado en Codebehi nd. Ser vi ce1
es la clase que representa al servicio y Hol aI nt er net Ser vi ce es el namespace en el
que est.

2) Ser vi ce1. asmx. cs

Es el fichero con el cdigo del servicio.

usi ng Syst em;
usi ng Syst em. Col l ect i ons;
usi ng Syst em. Component Model ;
usi ng Syst em. Dat a;
usi ng Syst em. Di agnost i cs;
usi ng Syst em. Web;
usi ng Syst em. Web. Ser vi ces;

namespace Hol aI nt er net Ser vi ce
{
/ / / <summar y>
/ / / Summar y descr i pt i on f or Ser vi ce1.
/ / / </ summar y>
publ i c cl ass Ser vi ce1 : Syst em. Web. Ser vi ces. WebSer vi ce
{
publ i c Ser vi ce1( )
{
/ / CODEGEN: Thi s cal l i s r equi r ed by t he ASP. NET Web
/ / Ser vi ces Desi gner
I ni t i al i zeComponent ( ) ;
}
Marco Besteiro y Miguel Rodrguez Clases
6/21 6

#r egi on Component Desi gner gener at ed code
/ / / <summar y>
/ / / Requi r ed met hod f or Desi gner suppor t - do not modi f y
/ / / t he cont ent s of t hi s met hod wi t h t he code edi t or .
/ / / </ summar y>
pr i vat e voi d I ni t i al i zeComponent ( )
{
}
#endr egi on

/ / / <summar y>
/ / / Cl ean up any r esour ces bei ng used.
/ / / </ summar y>
pr ot ect ed over r i de voi d Di spose( bool di sposi ng )
{
}

/ / WEB SERVI CE EXAMPLE
/ / The Hel l oWor l d( ) exampl e ser vi ce r et ur ns t he st r i ng
/ / Hel l o Wor l d
/ / To bui l d, uncomment t he f ol l owi ng l i nes t hen save and
/ / bui l d t he pr oj ect
/ / To t est t hi s web ser vi ce, pr ess F5

/ / [ WebMet hod]
/ / publ i c st r i ng Hel l oWor l d( )
/ / {
/ / r et ur n " Hel l o Wor l d" ;
/ / }
}
}

Los mtodos del servicio no son accesibles desde el exterior (usuarios). Un usuario slo
puede acceder a aquellos mtodos que hayan sido publicados, lo cual se hace
precedindolos del atributo [ WebMet hod] . Como se puede observar, el asistente no ha
publicado mtodo alguno, pero ha dejado un ejemplo entre comentarios (Hel l owWor l d).

3) Gl obal . cs

Este fichero contiene la clase Gl obal , que tiene mtodos de respuesta a ciertos eventos
sobre objetos generales (Appl i cat i on y Sessi on).

namespace Hol aI nt er net Ser vi ce
{
usi ng Syst em;
usi ng Syst em. Col l ect i ons;
usi ng Syst em. Component Model ;
usi ng Syst em. Web;
usi ng Syst em. Web. Sessi onSt at e;


/ / / <summar y>
/ / / Summar y descr i pt i on f or Gl obal .
/ / / </ summar y>
publ i c cl ass Gl obal : Syst em. Web. Ht t pAppl i cat i on
{
pr ot ect ed voi d Appl i cat i on_St ar t ( Obj ect sender , Event Ar gs e)
{
Marco Besteiro y Miguel Rodrguez Clases
7/21 7

}

pr ot ect ed voi d Sessi on_St ar t ( Obj ect sender , Event Ar gs e)
{

}

pr ot ect ed voi d Appl i cat i on_Begi nRequest ( Obj ect sender ,
Event Ar gs e)
{

}

pr ot ect ed voi d Appl i cat i on_EndRequest ( Obj ect sender , Event Ar gs
e)
{

}

pr ot ect ed voi d Sessi on_End( Obj ect sender , Event Ar gs e)
{

}

pr ot ect ed voi d Appl i cat i on_End( Obj ect sender , Event Ar gs e)
{

}
}
}

- Una vez se tiene el esqueleto del Servicio, se han de aadir los mtodos de tipo
[ WebMet hod] que se desee. En este caso se va a utilizar el mtodo que por
defecto aade el propio asistente como comentario.

/ / WEB SERVI CE EXAMPLE
/ / The Hel l oWor l d( ) exampl e ser vi ce r et ur ns t he st r i ng Hel l o
/ / Wor l d
/ / To bui l d, uncomment t he f ol l owi ng l i nes t hen save and bui l d
/ / t he pr oj ect
/ / To t est , r i ght - cl i ck t he Web Ser vi ce' s . asmx f i l e and sel ect
/ / Vi ew i n Br owser
/ /
[ WebMet hod]
publ i c st r i ng Hel l oWor l d( )
{
r et ur n " Hel l o Wor l d" ;
}

Entre las propiedades ms importantes del atributo [ WebMet hod] se encuentran
las siguientes:
o CacheDur at i on: permite especificar el nmero de segundos que la
respuesta del mtodo se mantendr en la cach. El valor por defecto es 0,
lo que quiere decir que la respuesta no se almacena en la cach.
Ejemplo: [ WebMet hod ( CacheDur at i on = 10) ]
o Descr i pt i on: descripcin del mtodo.
Marco Besteiro y Miguel Rodrguez Clases
8/21 8
o Enabl eSessi on: permite activar (t r ue) o desactivar (f al se) el
almacenamiento del estado de la sesin.
o MessageName: permite cambiar el nombre con el que se expone el
mtodo hacia los consumidores.
o Tr ansact i onOpt i on: Si se activa, todo el cdigo del mtodo se ejecuta
en la misma transaccin.
o Buf f er Response: Si se activa (t r ue), todos los datos se serializan y
luego se envan de un golpe. Si los datos a enviar al cliente son bastantes,
es mejor que su valor sea f al se, de este modo los datos sern enviados
al cliente segn se van serializando (poco a poco).

Utilizacin de un Web Service.
Para utilizar un Web Service, el modo bsico es llamarlo desde un navegador a travs de
su pgina . asmx (en diseo se puede llamar desde la opcin Depurar).
Tambin puede utilizarse un Web Service desde un cliente de tipo WebForm o
WinForm, pero hay que tener en cuenta algunos factores ms.

En este caso, si se desea utilizar el Web Service directamente desde el navegador se ha
de utilizar la siguiente URL:

ht t p: / / l ocal host / Hol aI nt er net Ser vi ce/ Ser vi ce1. asmx

El resultado es:



Figura 23.5. Resultado de invocar al servicio desde el Internet Explorer.
Marco Besteiro y Miguel Rodrguez Clases
9/21 9

Por defecto, el Web Service devuelve una pgina Web encabezada con informacin
sobre sus mtodos pblicos (en este caso slo hay uno, Hel l oWor l d). El resto de la
informacin son explicaciones e informacin de ayuda.

Si se pulsa sobre el vnculo Hel l oWor l d se muestra la pgina de la figura 23.6:



Figura 23.6. Pgina web de con informacin sobre el mtodo Hel l oWor l d. Ofrece la
posibilidad de invocarlo.

Esta pgina se divide en tres partes fundamentales:
- Botn de comando para invocar al mtodo Hel l oWor l d.
- Ejemplo de peticin (r equest ) y respuesta (r esponse) del mtodo mediante
SOAP.
- Ejemplo de peticin (r equest ) y respuesta (r esponse) del mtodo mediante
HTTP GET y mediante HTTP POST.

Si se pulsa el botn I nvoque se provoca una llamada al mtodo Hel l oWor l d y la
respuesta est representada en la figura 23.7:

Marco Besteiro y Miguel Rodrguez Clases
10/21 10


Figura 23.7. Resultado XML de invocar el mtodo Hel l oWor l d desde el Internet
Explorer.

Puede verse que es la cadena Hel l o Wor l d en lenguaje XML.
Si se observa la direccin que aparece en Direccin se ver que es:

ht t p: / / l ocal host / Hol aI nt er net Ser vi ce/ Ser vi ce1. asmx/ Hel l oWor l d?

Esto es una peticin http de tipo GET (generalmente se habla de mtodo GET y mtodo
POST, pero en este caso puede llevar a confusin con los mtodos reales de una clase).
Si se observa, en la pgina web anterior, se mostraba la estructura de una peticin GET:

GET / Hol aI nt er net Ser vi ce/ Ser vi ce1. asmx/ Hel l oWor l d? HTTP/ 1. 1
Host : l ocal host

que coincide con la peticin que aparece en el campo Direccin del navegador.

Tambin se mostraba la estructura de la respuesta HTTP GET:

HTTP/ 1. 1 200 OK
Cont ent - Type: t ext / xml ; char set =ut f - 8
Cont ent - Lengt h: length

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<st r i ng xml ns=" ht t p: / / t empur i . or g/ " >string</ st r i ng>

que tambin coincide con la estructura de la respuesta recibida en el navegador.
Evidentemente, en el navegador no se ve todo el texto XML recibido.
Marco Besteiro y Miguel Rodrguez Clases
11/21 11

Se puede concluir que la peticin realizada al pulsar el botn I nvoke y tambin la
respuesta han seguido la estructura HTTP GET.

La peticin y respuesta podan haber sido de tipo HTTP POST SOAP.

Una peticin HTTP POST se suele hacer cuando se deben enviar bastantes datos (un
formulario, por ejemplo). Es similar a GET pero separando los datos de la cabecera de
la peticin.

POST / Hol aI nt er net Ser vi ce/ Ser vi ce1. asmx/ Hel l oWor l d HTTP/ 1. 1
Host : l ocal host
Cont ent - Type: appl i cat i on/ x- www- f or m- ur l encoded
Cont ent - Lengt h: length

La respuesta HTTP POST es:

HTTP/ 1. 1 200 OK
Cont ent - Type: t ext / xml ; char set =ut f - 8
Cont ent - Lengt h: length

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<st r i ng xml ns=" ht t p: / / t empur i . or g/ " >string</ st r i ng>

Puede verse que coincide con la respuesta GET. Esto es as porque es la peticin la que
es GET o POST. La respuesta tiene la misma estructura en ambos casos.

La peticin y respuesta SOAP son ms complejas. SOAP (Simple Object Access
Protocol) es un protocolo pensado para representar en modo XML llamadas a mtodos
y tambin respuestas. En concreto, la estructura de una llamada SOAP al mtodo
Hel l oWor l d es:

POST / Hol aI nt er net Ser vi ce/ Ser vi ce1. asmx HTTP/ 1. 1
Host : l ocal host
Cont ent - Type: t ext / xml ; char set =ut f - 8
Cont ent - Lengt h: length
SOAPAct i on: " ht t p: / / t empur i . or g/ Hel l oWor l d"

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<soap: Envel ope xml ns: xsi =" ht t p: / / www. w3. or g/ 2001/ XMLSchema-
i nst ance" xml ns: xsd=" ht t p: / / www. w3. or g/ 2001/ XMLSchema"
xml ns: soap=" ht t p: / / schemas. xml soap. or g/ soap/ envel ope/ " >
<soap: Body>
<Hel l oWor l d xml ns=" ht t p: / / t empur i . or g/ " / >
</ soap: Body>
</ soap: Envel ope>

Se puede observar que una llamada SOAP es una peticin HTTP POST con un aadido.
En concreto, en esta llamada se indica que se invoca a un mtodo llamado Hel l oWor l d
y que no tiene parmetros.

La estructura de la respuesta SOAP es:

HTTP/ 1. 1 200 OK
Cont ent - Type: t ext / xml ; char set =ut f - 8
Marco Besteiro y Miguel Rodrguez Clases
12/21 12
Cont ent - Lengt h: length

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<soap: Envel ope xml ns: xsi =" ht t p: / / www. w3. or g/ 2001/ XMLSchema-
i nst ance" xml ns: xsd=" ht t p: / / www. w3. or g/ 2001/ XMLSchema"
xml ns: soap=" ht t p: / / schemas. xml soap. or g/ soap/ envel ope/ " >
<soap: Body>
<Hel l oWor l dResponse xml ns=" ht t p: / / t empur i . or g/ " >
<Hel l oWor l dResul t >string</ Hel l oWor l dResul t >
</ Hel l oWor l dResponse>
</ soap: Body>
</ soap: Envel ope>

En esta estructura se indica que el mtodo Hel l oWor l d devuelve un st r i ng.


Figura 23.8. Estructura de un mensaje SOAP.

SOAP no especifica como puede ser dirigido (enrutado) el mensaje hacia un servicio de
verificacin de firma. Para resolver este problema, Microsoft ha definido el protocolo de
enrutamiento SOAP, tambin llamado WS- Rout i ng, que define un bloque de cabecera
estndar que contiene la expresin con informacin de r out i ng.

La informacin sobre estas estructuras y ms est descrita en un fichero WSDL. La
descripcin WSDL del Web Service es accesible desde el hiperenlace Ser vi ce
Descr i pt i on de la primera pgina que muestra el servicio (antes del hiperenlace al
mtodo Hel l oWor l d).

Marco Besteiro y Miguel Rodrguez Clases
13/21 13

Figura 23.9. Estructura de la descripcin WSDL de un Web Service (pueden ser varios).

De un modo sencillo puede decirse que un fichero WSDL describe uno o varios
servicios. Un servicio es una coleccin de puertos (por t s) o direcciones que
implementan el servicio.

Por ejemplo:

<service name="Service1">
- <port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost/HolaInternetService/Serv
ice1.asmx" />
</port>
- <port name="Service1HttpGet"
binding="s0:Service1HttpGet">
<http:address
location="http://localhost/HolaInternetService/Serv
ice1.asmx" />
</port>
- <port name="Service1HttpPost"
binding="s0:Service1HttpPost">
Marco Besteiro y Miguel Rodrguez Clases
14/21 14
<http:address
location="http://localhost/HolaInternetService/Serv
ice1.asmx" />
</port>
</service>

Un puerto consta de:

- Definicin abstracta (por t Type): especifica el interface software del puerto, que
es un conjunto de operaciones que definen los intercambios ordenados de
mensajes (messages). Por ejemplo:

<portType name="Service1Soap">
<operation name="HelloWorld">
<input message="s0:HelloWorldSoapIn" />
<output message="s0:HelloWorldSoapOut" />
</operation>
</portType>

- Definicin concreta (bi ndi ng): especifica qu protocolos se utilizan por cada
puerto. Por ejemplo:

<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding
transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="HelloWorld">
<soap:operation
soapAction="http://tempuri.org/HelloWorld"
style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>

Un mensaje (message) es una coleccin de partes (par t ) con nombre de un tipo
particular. El tipo de una parte se define utilizando algn mecanismo de tipado de datos
estndar, como por ejemplo, la especificacin XML Schema.

Por ejemplo:

<message name="HelloWorldSoapIn">
<part name="parameters" element="s0:HelloWorld" />
</message>
<message name="HelloWorldSoapOut">
<part name="parameters"
element="s0:HelloWorldResponse" />
</message>

Marco Besteiro y Miguel Rodrguez Clases
15/21 15

El fichero WSDL de este ejemplo es:

<?xml version="1.0" encoding="utf-8" ?>
- <definitions xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s0="http://tempuri.org/"
targetNamespace="http://tempuri.org/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
- <types>
- <s:schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace="http://tempuri.org/">
- <s:element name="HelloWorld">
<s:complexType />
</s:element>
- <s:element name="HelloWorldResponse">
- <s:complexType>
- <s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="HelloWorldResult" nillable="true"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="string" nillable="true" type="s:string"
/>
</s:schema>
</types>
- <message name="HelloWorldSoapIn">
<part name="parameters" element="s0:HelloWorld" />
</message>
- <message name="HelloWorldSoapOut">
<part name="parameters" element="s0:HelloWorldResponse"
/>
</message>
<message name="HelloWorldHttpGetIn" />
- <message name="HelloWorldHttpGetOut">
<part name="Body" element="s0:string" />
</message>
<message name="HelloWorldHttpPostIn" />
- <message name="HelloWorldHttpPostOut">
<part name="Body" element="s0:string" />
</message>
- <portType name="Service1Soap">
- <operation name="HelloWorld">
<input message="s0:HelloWorldSoapIn" />
<output message="s0:HelloWorldSoapOut" />
</operation>
</portType>
Marco Besteiro y Miguel Rodrguez Clases
16/21 16
- <portType name="Service1HttpGet">
- <operation name="HelloWorld">
<input message="s0:HelloWorldHttpGetIn" />
<output message="s0:HelloWorldHttpGetOut" />
</operation>
</portType>
- <portType name="Service1HttpPost">
- <operation name="HelloWorld">
<input message="s0:HelloWorldHttpPostIn" />
<output message="s0:HelloWorldHttpPostOut" />
</operation>
</portType>
- <binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding
transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
- <operation name="HelloWorld">
<soap:operation
soapAction="http://tempuri.org/HelloWorld"
style="document" />
- <input>
<soap:body use="literal" />
</input>
- <output>
<soap:body use="literal" />
</output>
</operation>
</binding>
- <binding name="Service1HttpGet" type="s0:Service1HttpGet">
<http:binding verb="GET" />
- <operation name="HelloWorld">
<http:operation location="/HelloWorld" />
- <input>
<http:urlEncoded />
</input>
- <output>
<mime:mimeXml part="Body" />
</output>
</operation>
</binding>
- <binding name="Service1HttpPost" type="s0:Service1HttpPost">
<http:binding verb="POST" />
- <operation name="HelloWorld">
<http:operation location="/HelloWorld" />
- <input>
<mime:content type="application/x-www-form-
urlencoded" />
</input>
- <output>
<mime:mimeXml part="Body" />
</output>
</operation>
</binding>
Marco Besteiro y Miguel Rodrguez Clases
17/21 17
- <service name="Service1">
- <port name="Service1Soap" binding="s0:Service1Soap">
<soap:address
location="http://localhost/HolaInternetService/Serv
ice1.asmx" />
</port>
- <port name="Service1HttpGet"
binding="s0:Service1HttpGet">
<http:address
location="http://localhost/HolaInternetService/Serv
ice1.asmx" />
</port>
- <port name="Service1HttpPost"
binding="s0:Service1HttpPost">
<http:address
location="http://localhost/HolaInternetService/Serv
ice1.asmx" />
</port>
</service>
</definitions>

Estas estructuras son las que determinan cmo funciona por debajo la invocacin de
mtodos de Web Services pero no es necesario utilizarlas directamente. Cuando se
quiera invocar un mtodo de un Web Service desde una aplicacin (consumidora de
servicios) se utilizar una clase (pr oxy) que encapsular el funcionamiento real de la
llamada, ofreciendo a la aplicacin consumidora la sensacin de que el Web Service es
una clase local.

Creacin de una aplicacin consumidora de un servicio.
El modo normal de acceder a un Web Service es desde el cdigo de una aplicacin
consumidora del Web Service.

Los pasos a seguir para utilizar un Web Service desde una aplicacin consumidora son:

- Crear una clase pr oxy para acceder al Web Service.
- Instanciar y utilizar la clase.

Supnga que se desea crear una aplicacin Web (Web Forms) llamada
Pr uebaWebSer vi ce1 que conste de una pgina web (. aspx) con un botn de comando
y una caja de texto, de modo que al pulsar el botn de comando se invoque al mtodo
Hel l oWor l d del servicio Ser vi ce1 (aplicacin Hol aI nt er net Ser vi ce) y el resultado
devuelto por tal mtodo se muestre en la caja de texto.

La pgina Web ser algo as:

Marco Besteiro y Miguel Rodrguez Clases
18/21 18


Figura 23.10. Pgina WebForm para invocar el mtodo Hel l oWor l d del servicio.

Cuando se pulse el botn Pr obar Ser vi ce1 se ejecutar el cdigo del mtodo
manejador de su evento Cl i ck. Este cdigo debe invocar al mtodo Hel l oWor l d del
servicio Ser vi ce1.

Crear una clase proxy para acceder al Web Service.
Para poder invocar a un mtodo de un servicio, la aplicacin desde la que se hace la
invocacin (aplicacin cliente) debe disponer de un proxy para tal servicio.

Un proxy es un objeto local a la aplicacin cliente cuya estructura (mtodos...) es igual a
la del servicio que se desea utilizar. De este modo, la aplicacin cliente utilizar el
proxy pensando que es el servicio y el proxy se encargar de comunicarse con el
servicio e invocar sus mtodos mediante SOAP o HTTP.

Para crear el proxy hay que registrar el servicio en la aplicacin cliente, lo cual se hace
mediante la opcin Aadir Referencia Web del men Proyecto. Al hacerlo se muestra
un cuadro de dilogo con una caja de texto en la que se debe introducir la ruta al fichero
. vsdi sco correspondiente al servicio Ser vi ce1.

Para este ejemplo, la ruta es:

ht t p: / / l ocal host / Hol aI nt er net Ser vi ce1/ Hol aI nt er net Ser vi ce1. vsdi sco.

Marco Besteiro y Miguel Rodrguez Clases
19/21 19


Figura 23.11. Adicin a la aplicacin cliente de una referencia al Web Service
utilizando los servicios de descubrimiento (di scover y).

Como puede observarse, en la ventana de la izquierda se muestra el contenido del
fichero Hol aI nt er net Ser vi ce1. vsdi sco. En la ventana de la derecha se muestra de
un modo ms elegante el contenido del mismo fichero.

$$$$ (Ver la traduccin de estas opciones en la versin definitiva)

Si se selecciona la opcin view contract, se mostrar el contenido del fichero
Ser vi ce1. wsdl en la ventana izquierda. Si se selecciona la opcin view
documentation se mostrar la pgina correspondiente a la URL
ht t p: / / l ocal host / Hol aI nt er net Ser vi ce/ Ser vi ce1. asmx (ya vista anteriormente).

Para aadir una referencia al servicio Ser vi ce1 se ha de pulsar el botn Agregar
Referencia. Al hacerlo se aade al proyecto una Web Reference o referencia al web site
en el que est el servicio. En este caso la referencia es l ocal host (que es el site local
por defecto) y contiene a su vez informacin sobre Ser vi ce1.

Marco Besteiro y Miguel Rodrguez Clases
20/21 20


Figura 23.12. Ventana del explorador de soluciones. Se puede observar la referencia al
servicio Web.

Lo anterior se debe entender como que el servicio Ser vi ce1 es una clase que pertenece
al namespace l ocal host .

Instanciar y utilizar la clase.
Una vez se tiene la referencia al servicio, es decir, una vez se tiene el proxy local, es
posible instanciarlo y utilizarlo del mismo modo que se hara con cualquier otra clase.
Puesto que el servicio, desde el punto de vista del cliente, pertenece al namespace
l ocal host , habr que aadir al cdigo la lnea:

usi ng Pr uebaWebSer vi ce1. l ocal host ;

donde Pr uebaWebSer vi ce es el namespace del cliente.

El siguiente paso es utilizar la clase Ser vi ce1. Puesto que se desea que el mtodo
Hel l oWor l d del servicio Ser vi ce1 sea invocado cuando se pulse el botn
Pr obar Ser vi ce1 (But t on1) y el resultado que devuelva aparezca en la caja de texto, ha
de incluirse el siguiente cdigo en el mtodo But t on1_Cl i ck:

pr i vat e voi d But t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Ser vi ce1 ser v1 = new Ser vi ce1( ) ;
Text Box1. Text = ser v1. Hel l oWor l d( ) ;
}

Marco Besteiro y Miguel Rodrguez Clases
21/21 21
Puesto que Ser vi ce1 es conocido por el cliente -tambin en tiempo de diseo, que es
cuando ha sido descubierto- el asistente muestra ayuda contextual mientras se escribe.

El resultado de ejecutar la aplicacin cliente y pulsar el botn Pr obar Ser vi ci o1 ser
invocar al Web Service Ser vi ce1, en concreto al mtodo Hel l oWor l d y mostrar su
resultado en la caja de texto (Text Box1).



Figura 23.13. Resultado de invocar el mtodo Hel l oWor l d del Web Service desde la
aplicacin cliente.