You are on page 1of 8

XML Web Service

En ASP.NET los archivos de los Servicios Web XML estn identificados por la extensin .asmx. Estos
archivos son diferentes de los Web Forms; no definen ningn interfaz de usuario, solo definen las clases
y mtodos del Servicio Web XML. Es importante tener en mente que el consumidor de un Servicio Web
XML es otra aplicacin, no una persona, por eso el interfaz de usuario no es importante, lo que es
importante es el interfaz de la clase.

Un fichero .asmx bsico, sera como sigue:

<%@ WebService Language="c#" Class="MyService" %>

using System;
using System.Web.Services;

[WebService()]
public class MyService : WebService
{
[WebMethod()]
public String SayHello( String YourName )
{
return "Hello, " + YourName;
}
}

En este Servicio Web XML, vamos a crear una clase, MiServicio, como un Servicio Web XML, y exponer un
mtodo, Saludar( ). El mtodo recibe un valor String , y devuelve una cadena de texto, con la palabra
Hola delante. Es un Servicio Web XML muy sencillo de hacer, pero que muestra lo realmente necesario
para conocer como implementar uno desde cero. Este Servicio Web XML puede ser invocado usando
cualquiera de los protocolos HTTP GET, HTTP POST o SOAP. El argumento de entrada, es un tipo simple,
un String , as que cualquiera de los tres protocolos funcionar. Cuando sea invocado, este Servicio Web
XML devolver un documento XML conteniendo un valor String, como se muestra a continuacin:

<?xml version="1.0" encoding="utf-8"?>


<string xmlns="http://tempuri.org/">Hello, Doug Seven</string>

A continuacin vamos a mostrar como construir un Servicio Web XML bsico, identificar las partes, como
la directiva @WebService, y los atributos WebMethod y WebService

Qu es la directiva @WebService?
La primera parte de un fichero .asmx es la directiva @WebService. Esta directiva, como la directiva
@Page de un Web Form, se usa para identificar atributos especficos de un archivo de un Servicio Web
XML.

Language Especifica el lenguaje .NET que se usa para crear el Servicio Web XML.
Class Nos dice el nombre de la clase que est siendo expuesto como un Servicio Web XML. Esta
clase puede ser definida en el fichero .asmx, o en un ensamblado (assembly), que resida en el
directorio /bin de la aplicacin Web.

La directiva @WebService es el nico cdigo requerido por el fichero .asmx. Podemos crear un Servicio
Web XML de dos formas:

Definiendo la clase en el fichero .asmx, la cual luego ser compilada con un compilador JIT.
Definir la clase en un ensamblado (assembly), que sea compilado y que resida en el directorio
/bin de la aplicacin.
Si la clase especificada en el atributo Class reside en el ensamblado en el directorio /bin, entonces no se
necesita ningn otro cdigo ms que la directiva @WebService todo el cdigo del Servicio Web XML
estar en el archivo de la clase.

En el ejemplo anterior del Servicio Web XML, tenemos la directiva @WebService, seguida por dos
sentencias using , y una definicin de una clase para nuestro Servicio Web XML. Las sentencias using
proveen acceso a las clases especificadas en los espacios de nombres, sin tener que usar el nombre
completo (String frente a System.String).

El atributo WebService

El atributo WebService, el cual es actualmente la clase System.Web.Service.WebServiceAttribute , es un


atributo opcional que puede ser aplicado a una clase pblica que est siendo expuesta como un Servicio
Web XML. Podemos usar el atributo WebService para aplicar unos cuantos valores descriptivos a nuestro
Servicio Web XML:

Name Especifica el nombre a que se refiere el Servicio Web XML


Description Descripcin breve del Servicio Web XML.
Namespace Nos dice el espacio de nombres por defecto del Servicio Web XML.

La sintaxis para aplicar el atributo WebService a una definicin de una clase es un poquito diferente en
Visual Basic .NET y C#

[VB]
<WebService(Name:="MyService", Description:="This is a description.",
Namespace:="http://www.dotnetjunkies.com/")> _
Public Class MyWebServiceClass
'...
End Class

[C#]
[WebService(Name="MyService", Description="This is a description.",
Namespace="http://www.dotnetjunkies.com/")]
public class MyWebServiceClass{
//...
}

El atributo WebService solo puede ser aplicado a una clase declarada usando la palabra clave public.

Derivando de System.Web.Services.WebService

La clase que se expone como un Servicio Web XML puede (opcionalmente), derivar de la clase
System.Web.Services.WebService, como se muestra a continuacin:

[WebService()]
public class MyService : System.Web.Services.WebService
{
//Web methods go here
}

El derivar de la clase WebService permite acceder a las funcionalidades y objetos ms comunes de


ASP.NET, como por ejemplo Aplication Session, User y Context. Esto permite la gestin del estado en el
Servicio Web XML, en todo el ciclo de vida de la aplicacin Web o en una sesin particular. No es
necesario el derivar de la clase WebService, pero podemos si queremos aadir funcionalidades.

El atributo WebMethod
A diferencia de WebService, el atributo WebMethod, no es opcional, todos los mtodos que vayan a ser
expuestos como mtodos que se usarn en el Servicio Web XML, DEBEN tener el atributo WebMethod, y
deben ser declarados usando la palabra clave public. El atributo WebMethod indica al .NET Framework
que el mtodo especificado a continuacin debe ser accesible va protocolos estndar de Internet.

As pues, como el mtodo del Servicio Web (tambin mtodo Web), debe ser accesible usando protocolos
estndar de Internet, el mtodo Web debe ser definido como public, indicando que es accesible desde
fuera de la clase padre. Podemos crear mtodos protected, internal o private, en una clase de un
Servicio Web XML, pero no pueden ser expuestos como mtodos Web.

El atributo WebMethod expone las siguientes propiedades:

BufferResponse Especifica si la respuesta de este mtodo Web debe meterse en el buffer. Por
defecto es true.
CacheDuration Especifica el nmero de segundos que la respuesta del mtodo Web debe ser
almacenada en cach.
Description Descripcin breve de la funcionalidad del mtodo Web.
EnableSession Configura si el control de estado con Session est activado para el mtodo Web.
Por defecto es false.
MessageName Especifica el nombre usado por el mtodo Web. Por defecto el mtodo Web
tendr el mismo nombre que el nombre del mtodo. Usando el atributo MessageName podemos
usar alias para los mtodos web. Esto es particularmente til cuando se construyen mtodos
web sobrecargados el atributo MessageName nos permite utilizar diferentes nombres para los
mtodos sobrecargados.
TransactionOption Especifica el soporte a los servicios empresariales de transacciones
disponibles para el mtodo Web.
La sintaxis para VisualBasic .NET y C# sigue la misma pauta que el atributo WebService:

[VB]
<WebMethod(Description:="This is a description.")> _
Public Function MyWebMethod() As String
Return "FooBar"
End Function

[C#]
[WebMethod(Description="This is a description.")]
public String MyWebMethod(){
return "FooBar";
}

El producto final

Una vez que la clase del Servicio Web XML esta escrita, podemos buscar el archive .asmx y comprobar
los mtodos Web que hemos expuesto. Si la clase est en un archivo separado (*.vb, *.cs, etc.), entonces
la clase necesita ser compilada y el ensamblado (assembly), debe ser situado en el directorio /bin. Si la
clase del Servicio Web XML es definida en el archivo .asmx, entonces no se requiere compilacin el
Servicio Web XML ser compilado por el compilador JIT .

La pgina de prueba es automticamente generada por el .NET Framework. Incluye un enlace a la


Descripcin del Servicio (WSDL), y un enlace para cada mtodo Web en el Servicio Web XML.
Haciendo clic en el enlace del mtodo Web, se abre una pgina donde podemos comprobar el mtodo
Web, introduciendo los argumentos de entrada en controles TextBox, y probarlo haciendo clic sobre el
botn Invoke.

La prueba para invocar el mtodo Web solo est disponible para mtodos Web que no necesiten
argumentos, o bien que reciban argumentos simples (cadenas, nmeros). Si se usan tipos de datos
complejos como argumentos de entrada, entonces se necesita un mensaje SOAP para invocar el mtodo
Web, de manera que una implementacin de prueba de tipo HTTP GET o HTTP POST no est disponible.
Qu es tempuri.org?

En la primera parte de la pgina de comprobacin del Servicio Web XML, bajo la lista de los enlaces a los
mtodos Web, hay una seccin describiendo http://tempuri.org . Esto es un espacio de nombres XML
temporal que se asigna por defecto a todos los Servicios Web XML creados usando el .NET Framework, si
no se especific uno al crearlo. El espacio de nombres XML se usa para identificar unvocamente dos o
ms Servicios Web XML con el mismo nombre de clase. Podemos especificar el espacio de nombres del
servicio Web XML en el atributo WebService. Una de las propiedades de la clase WebServiceAttribute es
Namespace. Para definir por ejemplo http://www.dotnetjunkies.com como el espacio de nombres para
este Servicio Web XML, tenemos que modificar el atributo constructor WebService:

<%@ WebService Language="c#" Class="MyService" %>

using System;
using System.Web.Services;

[WebService(Namespace="http://www.dotnetjunkies.com")]
public class MyService : WebService
{
[WebMethod()]
public String SayHello( String YourName )
{
return "Hello, " + YourName;
}
}
Crear un Servicio Web XML

Comentarios Pasos
Vamos a crear un Servicio Web XML desde cero, utilizando Hacemos clic sobre Inicio, luego
alguna herramienta de ltimisima generacin como Visual ejecutar y escribimos notepad.
Studio 2005 o porqu no, la herramienta ms socorrida de Haciendo clic sobre Abrir o pulsando la
todo desarrollador web, el Microsoft Notepad. Por qu? tecla Enter se abre el Notepad
Pues esto es como aprender a sumar antes de usar la
calculadora, hacerlo con Visual Studio 2005 es tan sencillo
que la demo durara 3 minutos.

Utilizaremos C# como lenguaje para programar el servicio Hacemos clic sobre Archivo,
web, pero podramos utilizar Visual Basic, es a nuestra seleccionamos Guardar Como,
eleccin, con lo cual, con lo que nos sintamos ms cmodos. buscamos la ruta al directorio del
Empezamos ponindole nombre a nuestro Servicio Web, le servidor web (suele ser
vamos a llamar MiServicioWeb, con lo que lo primero que C:\InetPub\wwwroot\), seleccionamos
vamos a hacer es grabar el fichero con este nombre, y con Todos los Archivos y escribimos como
extensin ASMX. nombre de archivo MiServicio.asmx.
ASMX? S, ASMX es la extensin en la que se crean los
Servicios Web, para los que conozcan ASP.NET les sonar,
puesto que la extensin de los ficheros en ASP.NET es .ASPX
[Preguntar a la gente] En la primera lnea del archivo
Qu define a un Servicio Web? Qu hace que un fichero sea tecleamos: <%@ WebService
tenido por el .NET Framework por un Servicio Web? Language="C#" Class="WebService"
La directiva WebService que va situada al inicio del archivo y %> y guardamos presionando
que determina el lenguaje a utilizar en el Servicio Web y el CTRL+G.
nombre (si queremos).
En el atributo Language ponemos C# ya que este es el
lenguaje que vamos a utilizar para el servicio web, y en el
parmetro class escribimos el nombre que quedamos ponerle
al Servicio Web, en este caso MiServicioWeb
Necesitamos tener acceso al espacio de nombres de los Aadimos:
Servicios Web, as como tambin es una buena prctica el using System;
aadir una referencia a los recursos del sistema using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
Guardamos de nuevo.
Aadimos la directiva
[WebService(Namespace =
"http://tempuri.org/")]
Exponemos la clase como pblica
public class WebService :
System.Web.Services.WebService { }
Un Servicio Web XML puede estar compuesto por uno o ms public string RecibirDisparo(int X, int Y)
mtodos, expuestos con la palara WebMethod. En este caso {
podemos utilizar uno muy conocido, el famoso Hola Mundo, string Resultado = "Agua";
if ((X>=1) & (X<=10))
bueno no, vamos a utilizar otro, un poco ms complejo, que
{
admita algn parmetro, y como la cosa va de guerra de if ((Y>=1) & (Y<=10))
barcosHacemos uno muy chorra {
// X e Y entre 1 -10
If ((X=5) & (Y=5))
Resultado = Tocado;
}
else
{
// Rango de Y errneo: ERROR
Resultado = "ERROR: X debe ser un
nmero entre 1 y 10";
}
}
else
{
// Rango de X errneo: ERROR
Resultado = "ERROR: X debe ser un
nmero entre 1 y 10";
}
return Resultado+ "X=5,Y="5";
}
Guardamos de nuevo, y ejecutamos desde Internet Explorer.
Mostrndonos la pgina de resumen, comentamos las
caractersticas, el mensaje SOAP, etcy la caja de prueba con
los valores.
Se prueba y esas cosas, y se ve que funciona.
Las aplicaciones normales con servicios web que creemos Abrimos una ventana con el smbolo del
trabajan con una clase Proxy, que se puede generar gracias a sistema y nos vamos al directorio web
una herramienta que contiene el .NET Framework que se donde hemos creado nuestro servicio.
llama WSDL. WSDL coge un servicio web y lo transforma en Tecleeamos
una clase Proxy utilizando el lenguaje de programacin WSDL y pulsamos Enter y enseamos
especificado en la lnea de comandos. las distintas opciones que tiene,
comentando algunas de ellas
Se pronuncia gisdel Tecleamos wsdl /L:cs
/NAMESPACE:MiServicio
/OUT:MiServicioProxy.cs
http://localhost/MiServicio.asmx
Y Enter
Se genera la clase proxy con este comando, y ya est lista la Introducimos el compilador csc, desde
clase para ser compilada, utilizando el compilador de linea de la ventana de commandos, tecleamos:
comandos que provee Visual Studio: csc csc /t:library MiservicioProxy.cs
Con esto hemos generado una dll que almacena la clase
Proxy y su cdigo. Ponemos la dll en la misma carpeta que la
aplicacin que la requiere, para que sea ms sencillo de
gestionar.

Ahora si tenemos otra aplicacin, que quiere usar esta clase, Import MiServicio;
lo que debemos hacer es muy sencillo: Importar la clase en
nuestro cdigo
Y luego aadiendo en nuestra clase, por ejemplo para usarlo: var NumeroPrimo : boolean;
var proxy : MiServicio.WebService;

proxy = new WebService();


NumeroEsPrimo =
Convert.ToBoolean( proxy.EsPrim0( Num
eroTest ) );

Si quisiramos podramos crear el fichero disco para


anunciar la existencia del Servicio Web.
Ahora vamos a hacerlo con Visual Studio 2005, y con el Creamos un nuevo proyecto en Visual
ejemplo de la Guerra de Barcos que tenemos preparado. Studio, un Nuevo proyecto Web, de tipo
ASP Web Service.
Enseamos como Visual Studio ha creado completamente el
servicio web necesario, incluso nos ha puesto de ejemplo un
servicio web Hola Mundo.
Mostramos las cabeceras, etc, y lo ejecutamos para ver que
funciona.
Cargamos el proyecto del WebService
de la guerra de barcos
Enseamos un poco el programa, como coloca los barcos, Ejecutamos el proyecto y seleccionamos
etc. Y Ponemos un punto de interrupcin para ensear como una de las funciones, para que el
se puede depurar un servicio web. proyecto se pare en el punto de
interrupcin
Mostramos como funciona, y esas cosas, e insistimos en los
mtodos, etc