Monday, February 12, 2007

Web Services

Web Services
(Fundamentos)



  1. 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.


  1. Ejemplos:



    1. Sencilla aplicación comercial



  1. Crear una interfaz de la siguiente manera.





  1. Crear un servicio web con la sgte estructura:





  1. 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;
}

}


  1. El atributo Description de la directa [WebMethod], permitira lo siguiente:





  1. Agregar la referencia Web.





  1. Agregar la declaración:





  1. 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";
}

}



    1. Aplicación para el intercambio de archivos.



  1. Crear el siguiente esquema para el servicio Web.





  1. 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;
}


  1. Agregar un nuevo proyecto, “Console Application”, y que tenga la siguiente estructura:





  1. Agregar la siguiente Referencia Web al servicio Web definido anteriormente:




  1. 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");

}



  1. Utilizándolo:



    1. Ir a la siguiente ruta:





    1. Abrir una consola, y ejecutar el .exe que se encuentra en la carpeta debug.





    1. 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.

1 comment:

Anonymous said...

Los colores de texto e imágenes del blog son horribles para leer. Además, las imágenes no se ven bien. Me voy sin leer nada. Lo siento.