Web Services
(Fundamentos)
Introducción:
Se mostrara cuan fácil es crear un Servicio Web.
Lo fácil que es reusar una aplicación .Net, y mover la lógica de negocio a un Web Service, estando así disponible para otras aplicaciones.
Tendremos dos ejemplos, el primero, que se encarga de recolectar la información de pago, y el segundo, que se encarga de enviar y recibir archivos, siendo representados los archivos binarios dentro de un tipo complejo.
Se resolverán algunos casos, los cuales se harán paso a paso, ya que aprenderemos haciendo.
Ejemplos:
Sencilla aplicación comercial
Crear una interfaz de la siguiente manera.
Crear un servicio web con la sgte estructura:
Escribir el siguiente método en al Archivo code-behind TarjetaCredito.cs:
[WebMethod(Description = "Este método se encarga de validar el nro de tarjeta de crédito")]
public bool validarTarjeta(String nroTarjeta, DateTime fchaVcto)
{
if (fchaVcto >= DateTime.Today)
{
int total = 0;
int temp = 0;
char[] ccDigitos = nroTarjeta.ToCharArray();
for (int i = 0; i < nroTarjeta.Length; i++)
{
if (((i + 1) % 2) == 0)
{
total += int.Parse(ccDigitos[i].ToString());
}
else
{
temp = int.Parse(ccDigitos[i].ToString()) * 2;
if (temp > 9)
{
temp = (int)temp - 9;
}
total += temp;
}
}
if ((total % 10) == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
El atributo Description de la directa [WebMethod], permitira lo siguiente:
Agregar la referencia Web.
Agregar la declaración:
Programar el evento click del boton Colocar orden.
protected void btncolord_Click(object sender, EventArgs e)
{
TarjetaCredito o_tc = new TarjetaCredito();
if (o_tc.validarTarjeta(txtnrotarjeta.Text, cldfecha.SelectedDate))
{
lblstatus.Text = "Gracias por su orden.";
}
else
{
lblstatus.Text = "Tarjeta de crédito invalida";
}
}
Aplicación para el intercambio de archivos.
Crear el siguiente esquema para el servicio Web.
En el archivo Code-Behind DirectorioWeb agregar los siguientes namespaces y los WebMethods.
Crear el siguiente estructura, va por encima de la declaración de la propiedad de WebService.
[WebMethod]
public string[] ListarArchivos()
{
return Directory.GetFiles("d:\Publica");
}
[WebMethod (Description = "Permite al cliente solicitar un archivo.")]
public ArchivoWeb ObtenerArchivo(string nombreArchivo)
{
ArchivoWeb archivoWeb = new ArchivoWeb();
string rutaArchivo = "d:\Publica\" + nombreArchivo;
//establecer el nombre del archivo
archivoWeb.Nombre = nombreArchivo;
//obtener el contenido del archivo solicitado
Stream s = File.Open(rutaArchivo, FileMode.Open,FileAccess.Read);
archivoWeb.contenido = new byte[s.Length];
s.Read(archivoWeb.contenido, 0, (int)s.Length);
s.Close();
//obtener los sellos de fechas para el archivo
archivoWeb.FchaCreacion = File.GetCreationTime(rutaArchivo);
archivoWeb.FchaUltAcceso = File.GetLastAccessTime(rutaArchivo);
archivoWeb.FchaUltEscritura = File.GetLastWriteTime(rutaArchivo);
return archivoWeb;
}
Agregar un nuevo proyecto, “Console Application”, y que tenga la siguiente estructura:
Agregar la siguiente Referencia Web al servicio Web definido anteriormente:
Implementar los siguiente metodos:
static int Main(string[] args)
{
//validar el numero de los argumentos de comando de linea
if (args.Length < 1 || args.Length > 3)
{
MostrarUso();
return 1;
}
//inicializar variables
string origen = args[1];
string destino = origen;
if (args.Length == 3)
{
destino = args[2];
}
//Procesar los comandos que fueron pasados
switch (args[0].ToUpper())
{
case "DIR":
ListarArchivos();
break;
case "GET":
obtenerArchivo(origen, destino);
break;
default:
MostrarUso();
break;
}
return 0;
}
private static void ListarArchivos() {
DirectorioWeb dirWeb = new DirectorioWeb();
string[] archivos;
archivos = dirWeb.ListarArchivos();
foreach (string archivo in archivos)
{
Console.WriteLine(archivo);
}
Console.WriteLine("n{0} archivo(s) en el directorio.", archivos.Length);
}
private static void obtenerArchivo(string origen,string destino) {
DirectorioWeb dirWeb = new DirectorioWeb();
ArchivoWeb archWeb = new ArchivoWeb();
//traer el archivo solicitado y guardarlo en el disco
archWeb = dirWeb.ObtenerArchivo(origen);
//guardo el archivo web requerido y lo copio a mi sistema
//de archivos
FileStream fs = File.OpenWrite(destino);
fs.Write(archWeb.contenido, 0, archWeb.contenido.Length);
fs.Close();
//establecer el sello de fecha y tiempo para el archivo
File.SetCreationTime(destino, archWeb.FchaCreacion);
File.SetLastAccessTime(destino, archWeb.FchaUltAcceso);
File.SetLastWriteTime(destino, archWeb.FchaUltEscritura);
}
private static void MostrarUso()
{
Console.WriteLine("Se usa el ArchivoWeb para traer archivos"+
"desde el servicio web directorioWeb.");
Console.WriteLine("nUso: Origen de comando archivoWeb [destination]");
Console.WriteLine("tComando - DIR o GET");
Console.WriteLine("tOrigen - El nombre del archivo a "+
"traer");
Console.WriteLine("tDestino - Opcionalmente el nombre de el"+
" archivo de destino.");
Console.WriteLine("nEjemplos");
Console.WriteLine("tArchivoWeb obtiene algun archivo.exe");
Console.WriteLine("tArchivoWeb obtiene algun archivo.exe c:temp");
Console.WriteLine("tArchivoWeb obtiene algun archivo.exe c:\temp\myfile.exe");
}
Utilizándolo:
Ir a la siguiente ruta:
Abrir una consola, y ejecutar el .exe que se encuentra en la carpeta debug.
En la siguiente consola, escribir la ruta y pasarle los parámetros requeridos.
Antes del copiado(copiaremos hola.txt).
Escribir el siguiente comando:
El archivo fue copiado satisfactoriamente:
Bibliografía
Libro Building XML Web Services for the Microsoft .Net Platform.
Capitulo 2 – Creating a Basic Web Service.