Professional Documents
Culture Documents
Recuerda que el campo ID debe tener la propiedad de Identidad. Ya que tengas la tabla
completa, ahora llnala con unos cuantos registros.
Esta tabla ser la misma que utilizaremos en ambos servicios, as que ya podemos dejar
de lado a SQL, y comenzar con la creacin de los servicios. As que tu escoges hacia
donde ir ahora.
Como puedes ver el mtodo lleva antes el prefijo [WebMethod] y es pblico, debes
considerar estos dos elementos para poder hacer tu mtodo accesible desde la web, y es
aqu en donde nos encargaremos de crear tres mtodos, uno de consulta, uno de edicin y
uno de actualizacin (el de borrar quedar de tarea Te late?).
Antes de continuar, debo aclarar algo muy importante, ser un tanto injusto al crear
estos servicios comparados con los WCF pero quiero hacerlo de la forma mas bsica
para que de paso puedas cubrir una gama mas amplia de tecnologas, pero para
calmar mi conciencia debo decirte que puedes mezclar tecnologas sin problemas.
Lo primero que insertaremos aqu ser un mtodo privado que nos permitir el acceso a
nuestra cadena de conexin.
private string cadenaConexion()
{
string cadena = "Data Source=SERVIDORAMIN;Initial
Catalog=Directorio;Integrated Security=True;";
return cadena;
}
Consultar informacin
Este mtodo nos dar toda la informacin de nuestros contactos.
[WebMethod]
public List<string> MostrarTodosLosContactos()
{
List<string> listaClientes = new List<string>();
SqlConnection conexion = new SqlConnection(cadenaConexion());
SqlDataAdapter adaptador;
string Consulta = "SELECT * FROM Contacto";
DataTable datos = new DataTable();
adaptador = new SqlDataAdapter(Consulta, conexion);
adaptador.Fill(datos);
foreach (DataRow registros in datos.Rows)
{
listaClientes.Add(registros["ID"].ToString() + "|" +
registros["Nombre"].ToString() + "|" +
registros["APELLIDOS"].ToString() +
"|" + registros["TELEFONO"].ToString() + "|" +
registros["EMAIL"].ToString());
}
return listaClientes;
}
Creamos una lista de tipo string y por medio de los datos que obtenemos de la consulta
vamos llenando la lista, as de simple.
Insertar registros
Este mtodo nos dar la posibilidad de insertar nuevos registros en nuestra tabla.
[WebMethod]
public int InsertarNuevaFecha(string Nombre, string Apellidos,
string Telefono, string Email)
{
string cadenaActualizar = "INSERT INTO Contacto (Nombre,
APELLIDOS, TELEFONO, EMAIL) values (@nombre, @apellidos,
@telefono, @email)";
int t = 0;
using (SqlConnection conexion = new
SqlConnection(cadenaConexion()))
{
SqlCommand comando = new SqlCommand(cadenaActualizar, conexion);
conexion.Open();
comando.Parameters.AddWithValue("@nombre", Nombre);
comando.Parameters.AddWithValue("@apellidos", Apellidos);
comando.Parameters.AddWithValue("@telefono", Telefono);
comando.Parameters.AddWithValue("@email", Email);
t = comando.ExecuteNonQuery();
conexion.Close();
}
return t;
}
Como puedes ver, lo que hacemos es simplemente recibir los parmetros y en base a ellos
insertar un nuevo elemento en nuestra tabla, como es obligatorio que TODOS los mtodos
accesibles desde web regresen un valor, en este caso regresamos el valor de las
operaciones realizadas.
Actualizar registros
Este mtodo nos dar la posibilidad de modificar a los registros que ya tenemos, ya sea en
uno solo o en todos sus atributos.
[WebMethod]
public int ActualizarContacto(string ID, string Nombre, string
Apellidos, string Telefono, string Email)
{
string cadenaActualizar = "UPDATE Contacto SET Nombre=@nombre,
APELLIDOS=@apellidos, TELEFONO=@telefono, EMAIL=@email WHERE (ID
=" + ID + ")";
int t = 0;
using (SqlConnection conexion = new
SqlConnection(cadenaConexion()))
{
SqlCommand comando = new SqlCommand(cadenaActualizar, conexion);
conexion.Open();
comando.Parameters.AddWithValue("@nombre", Nombre);
comando.Parameters.AddWithValue("@apellidos", Apellidos);
comando.Parameters.AddWithValue("@telefono", Telefono);
comando.Parameters.AddWithValue("@email", Email);
t = comando.ExecuteNonQuery();
conexion.Close();
}
return t;}
Aqu de una forma muy parecida al mtodo anterior recibimos todos los argumentos y con
la sentencia SQL actualizamos los datos en funcin de su campo ID.
Bien, si ya tienes los mtodos completados y ejecutas tu servicio web, el resultado ser
muy similar a esto.
Si pruebas en los otros dos mtodos notars que te piden que llenes informacin, esto es
debido a los parmetros que los mtodos necesitan para poder operar de manera
adecuada. En el caso del mtodo que usamos, presiona el botn Invocar y tu resultado
debe ser este.
As es, nada mas que un XML que nos estar regresando la informacin que le solicitamos.
Hasta aqu ya tenemos nuestro servicio web realizado, pero para que Silverlight pueda
consumirlo, deberemos publicarlo en nuestro IIS, as que vamos para eso.
Publicar mi servicio en IIS
En la ruta C:\inetpub\wwwroot (debes tener instalado IIS para esto), crea una nueva
carpeta.
Al seleccionar la opcin marcada te aparecer una ventana como la de abajo, solo da clic
en aceptar.
Solo basta que presiones Publish y veas en la esquina inferior izquierda y en tu ventana
de Output los siguientes mensajes.
Ya que tienes ese letrero, puedes escribir la url de tu sitio con la siguiente secuencia
http://NombreDeTuServidor/NombreDeTuCarpeta/NombreDeTuServicio, en mi caso qued
as http://localhost/ServicioASP/Service1.asmx.
La clase IService.cs nos servir como interfaz de nuestro proyecto, es decir, aqu ser en
donde coloquemos las funciones pblicas que permitiremos que puedan ser accedidas va
web. La clase Service1.svc.cs ser la encargada de colocar toda la funcionalidad requerida
de nuestro servicio, por ahora esas dos clases son las que nos interesan. Para continuar da
clic derecho en tu proyecto y selecciona la opcin Add>New Item, ah en la seccin Data
elige Linq to SQL Classes.
Ya con tu modelo creado y tu tabla agregada, entonces podremos comenzar a crear los
mismos tres mtodos que vimos en el artculo anterior, comenzaremos en la clase
Service1.svc.cs creando las operaciones.
Para empezar podrs notar que la clase hereda las propiedades de la clase IService1, es
por ello que trabajan de una forma muy vinculada.
Como mencion en el artculo anterior, en el servicio web ASP.NET mostr una forma
de hacerlo completamente diferente, pero aclaro que de esta manera tambin podra
ser hecho, mi intencin es demostrar la forma mas antigua y bsica que hay as
como la que a mi gusto no solo es la mas nueva, sino que la mas sencilla.
Lo primero que debemos hacer es declarar un objeto de tipo ModeloDatosDataContext,
esta clase puede variar de acuerdo a como nombraste a tu modelo anterior y ser
justamente eso, un contexto, un comunicador entre tus tablas inlcuidas dentro de tu modelo
y tus operaciones. La sintaxis es la siguiente.
ModeloDatosDataContext contexto;
Consultar informacin
Este mtodo nos dar toda la informacin de nuestros contactos.
public List<Contacto> MostrarTodosLosContactos()
{
contexto = new ModeloDatosDataContext();
List<Contacto> listaResultado = (from l in
contexto.Contactos
select l).ToList();
return listaResultado;
}
Creamos un mtodo que nos regresar una lista del mismo tipo de la clase que
necesitamos obtener, de esta forma y utilizando una sentencia LINQ muy sencilla obtendrs
todos los registros.
Insertar registros
Este mtodo nos dar la posibilidad de insertar nuevos registros en nuestra tabla.
bool ActualizarContacto(Contacto
contactoActualizado);
}
Ya teniendo todo esto listo, presiona F5 para ejecutar tu servicio (ten la pestaa de
IService1.cs en pantalla) y el resultado ser as.
Selecciona la ruta remarcada en la imagen de arriba y lo que obtendrs ser esta pantalla.
La primer diferencia que notars con respecto a los servicios ASP.NET es que estos no
exponen los mtodos que contienen, la nica forma de poder acceder a ellos es mediante
un cliente, y eso es justamente lo que haremos, detn la ejecucin y ahora ejecuta de
nuevo, pero con la clase Service1.svc.cs en primer plano, de esta manera ejecutars de
manera automtica una aplicacin llamada WCF Test Client, que te permitir ver tus
mtodos y trabajar con ellos.
Si ya tienes tu carpeta virtual lista, sigue el mismo procedimiento que en el servicio web
ASP.NET para publicar va Visual Studio 2010. Cuando tu servicio web haya sido
satisfactoriamente publicado, ve a un explorador y escribe una direccin con los siguientes
trminos http://NombreDeTuServidor/NombreDeTuCarpetaVirtual/NombreDeTuServicio.svc
en mi caso el resultado qued como http://servidoramin/ServicioWCF/Service1.svc.
4.
Este artculo es la cuarta parte de una mini serie que intenta ensearte como crear, publicar
y ahora consumir servicios web, el primer artculo habla de la base de datos que has
estado usando, puedes ver aqu como crear servicios web ASP.NET y aqu como crear
servicios WCF.
Creo que la mejor manera de manejar ambos servicios anteriormente creados es en una
sola aplicacin, para ahorrar la parte del diseo te dejo una imagen gua.
En el cuadro de dilogo, comienza con el servicio web ASP.NET, recuerda la URL, algo as
como
Despus de presionar Ok, repite la misma operacin pero ahora con la liga del servicio
WCF.
Hasta aqu, como puedes ver, el procedimiento es exactamente el mismo para ambos tipos
de servicios, la diferencia comenzar de aqu en adelante, vamos primero a declarar cada
uno de los objetos de los servicios.
//servicioASP
ServicioDatosASP.Service1SoapClient servicioASP = new
ServicioDatosASP.Service1SoapClient();
//servicioWCF
ServicioDatosWCF.Service1Client servicioWCF = new
ServicioDatosWCF.Service1Client();
Como puedes ver, la diferencia es grande desde aqu, el protocolo de servicio de ASP.NET
es SOAP, cuando en WCF utilizas un cliente sin ese protocolo, en los manejadores de
eventos para consultar informacin, tendrs las diferentes lneas.
Consultar Informacin
Para el servicio ASP.NET necesitas crear primero una clase, de la siguiente forma.
public
{
public
public
public
public
}
class NombreContacto
string
string
string
string
Y ya con la clase creada, poder usar un evento clic para poder consultar al servicio web.
void servicioASP_MostrarTodosLosContactosCompleted
(object sender, ServicioDatosASP.MostrarTodosLosContactosCompletedEventA
{
if (e.Error == null)
{
List listaContactos = new List();
foreach (string entidad in e.Result)
{
NombreContacto contacto = new NombreContacto();
contacto.Nombre = entidad.Split('|')[1];
contacto.Apellidos = entidad.Split('|')[2];
contacto.Telefono = entidad.Split('|')[3];
contacto.Email = entidad.Split('|')[4];
listaContactos.Add(contacto);
}
dgDatosASP.ItemsSource = listaContactos;
}
}
Por el lado de WCF tendrs lo siguiente.
private void btnObtenerContactosWCF_Click(object sender,
System.Windows.RoutedEventArgs e)
{
servicioWCF.MostrarTodosLosContactosCompleted += new
EventHandler<ServicioDatosWCF.MostrarTodosLosContactosCompletedEventA
(servicioWCF_MostrarTodosLosContactosCompleted);
servicioWCF.MostrarTodosLosContactosAsync();
}
void servicioWCF_MostrarTodosLosContactosCompleted(object sender,
ServicioDatosWCF.MostrarTodosLosContactosCompletedEventArgs e)
{
if (e.Error == null)
{
dgDatosWCF.ItemsSource = e.Result;
}
}
Como ves? Una gran diferencia no es as? Bueno, tambin debes considerar que por el
lado de XAML hay una diferencia con los DataGrid que ests usando.
Este es el DataGrid que estamos usando para el servicio web ASP.NET.
{
servicioASP.InsertarNuevoContactoCompleted += new EventHandler<
ServicioDatosASP.InsertarNuevoContactoCompletedEventArgs>
(servicioASP_InsertarNuevoContactoCompleted);
servicioASP.InsertarNuevoContactoAsync(txtNombreNuevoASP.Text,
txtApellidosNuevoASP.Text, txtTelefonoNuevoASP.Text, txtCorreoNuevoASP.Text);
}
void servicioASP_InsertarNuevoContactoCompleted(object sender,
ServicioDatosASP.InsertarNuevoContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreNuevoASP.Text = string.Empty;
txtApellidosNuevoASP.Text = string.Empty;
txtTelefonoNuevoASP.Text = string.Empty;
txtCorreoNuevoASP.Text = string.Empty;
MessageBox.Show("Tu nuevo contacto ha sido agregado");
}
}
En el caso del servicio WCF, ser de la siguiente forma.
private void btnIngresarWCF_Click(object sender, System.Windows.RoutedEventArgs
{
servicioWCF.InsertarContactoCompleted += new
EventHandler<ServicioDatosWCF.InsertarContactoCompletedEventArgs>(
servicioWCF_InsertarContactoCompleted);
ServicioDatosWCF.Contacto nuevoContacto = new ServicioDatosWCF.Contacto();
nuevoContacto.Nombre = txtNombreNuevoWCF.Text;
nuevoContacto.APELLIDOS = txtApellidosNuevoWCF.Text;
nuevoContacto.TELEFONO = txtTelefonoNuevoWCF.Text;
nuevoContacto.EMAIL = txtCorreoNuevoWCF.Text;
servicioWCF.InsertarContactoAsync(nuevoContacto);
}
void servicioWCF_InsertarContactoCompleted(object sender,
ServicioDatosWCF.InsertarContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreNuevoWCF.Text = string.Empty;
txtApellidosNuevoWCF.Text = string.Empty;
txtTelefonoNuevoWCF.Text = string.Empty;
txtCorreoNuevoWCF.Text = string.Empty;
MessageBox.Show("Tu nuevo contacto ha sido agregado");
}
}
Actualizar informacin
Para poder modificar elementos de nuestros contactos lo primero que debes hacer es
manejar el manejador para el evento SelectionChanged de los respectivos DataGrid.
En el caso de ASP.NET te debe quedar as.
private void dgDatosASP_SelectionChanged(object sender,
System.Windows.Controls.SelectionChangedEventArgs e)
{
contactoElegidoASP = new NombreContacto();
contactoElegidoASP = dgDatosASP.SelectedItem as NombreContacto;
txtNombreModificarASP.Text = contactoElegidoASP.Nombre;
txtApellidosModificarASP.Text = contactoElegidoASP.Apellidos;
txtTelefonoModificarASP.Text = contactoElegidoASP.Telefono;
txtCorreoModificarASP.Text = contactoElegidoASP.Email;
}
Y en el caso de WCF ser as.
private void dgDatosWCF_SelectionChanged(object sender,
System.Windows.Controls.SelectionChangedEventArgs e)
{
contactoElegidoWCF = new ServicioDatosWCF.Contacto();
contactoElegidoWCF = dgDatosWCF.SelectedItem as
ServicioDatosWCF.Contacto;
txtNombreModificarWCF.Text = contactoElegidoWCF.Nombre;
txtApellidosModificarWCF.Text = contactoElegidoWCF.APELLIDOS;
txtTelefonoWCF.Text = contactoElegidoWCF.TELEFONO;
txtCorreoModificarWCF.Text = contactoElegidoWCF.EMAIL;
}
Y en el caso del evento clic de los respectivos botones, te debe quedar de la siguiente
manera.
Para el evento del botn de ASP.
private void btnModificarASP_Click(object sender,
System.Windows.RoutedEventArgs e)
{
servicioASP.ActualizarContactoCompleted +=
servicioASP_ActualizarContactoCompleted;
servicioASP.ActualizarContactoAsync(contactoElegidoASP.ID,
txtNombreModificarASP.Text, txtApellidosModificarASP.Text,
txtTelefonoModificarASP.Text, txtCorreoModificarASP.Text);
}
void servicioASP_ActualizarContactoCompleted(object sender,
ServicioDatosASP.ActualizarContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreModificarASP.Text = string.Empty;
txtApellidosModificarASP.Text = string.Empty;
txtTelefonoModificarASP.Text = string.Empty;
txtCorreoModificarASP.Text = string.Empty;
MessageBox.Show("Tu registro ha sido actualizado");
}
}
Y para el evento del botn WCF.
private void btnModificarWCF_Click(object sender,
System.Windows.RoutedEventArgs e)
{
servicioWCF.ActualizarContactoCompleted += new
EventHandler<ServicioDatosWCF.ActualizarContactoCompletedE
ventArgs>
(servicioWCF_ActualizarContactoCompleted);
servicioWCF.ActualizarContactoAsync(contactoElegidoWCF);
}
void servicioWCF_ActualizarContactoCompleted(object sender,
ServicioDatosWCF.ActualizarContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreModificarWCF.Text = string.Empty;
txtApellidosModificarWCF.Text = string.Empty;
txtTelefonoWCF.Text = string.Empty;
txtCorreoModificarWCF.Text = string.Empty;
MessageBox.Show("Tu registro ha sido actualizado");
}
}