Hola que tal, esta vez vamos a
consumir el web service que creamos en la entrada anterior esto es
muy sencillo para ello vamos a crear unas pantallas donde se puedan
ingresar los datos de una persona (nombre y apellido) para utilizar
los métodos que creamos en el servicio.
Bueno Iniciamos con la pantalla de
recepción de información, muy sencilla la idea solo es consumir los
métodos creados anteriormente y esta tiene que quedar más o menos
así:
Abrimos nuestro Visual Studio
Creamos un nuevo sitio web
Elegimos un nombre para el sitio web
(consumirservicio)
Luego que demos OK agregamos un
nuevo elemento al proyecto
Dicho elemento de tipo formulario
web al cual le daremos un nombre (consumo.aspx)
Damos click en Add y ahora vamos
agregar una referencia de servicio a nuestro sitio. Nos vamos a al
explorador de soluciones para ello.
La referencia esta direccionada a la
aplicación que montamos en nuestro servidor local IIS
Click en OK y veremos lo siguiente:
Click en OK y con ello nuestro
servicio solo está esperando ser consumido POR nuestra aplicación :) ……..Una vez con esto el código para crear las pantallas deberá
quedar así:
<%@
Page
Language="C#"
AutoEventWireup="true"
CodeFile="consumo.aspx.cs"
Inherits="consumo"
%>
<!DOCTYPE
html>
<html
xmlns="http://www.w3.org/1999/xhtml">
<head
runat="server">
<title>Consumo
Web</title>
</head>
<script
type="text/javascript">
function
sinnombre() {
alert("Sin
nombre");
}
function
sinape() {
alert("Sin
Apellido");
}
</script>
<body>
<form
id="form1"
runat="server">
<div>
<table>
<tr>
<td
>
Consumiendo
Servicio Web
</td>
<td>Datos
de la persona</td>
</tr>
<tr>
<td>
<fieldset>
<legend>Insertar
datos</legend>
<table>
<tr>
<td>Nombre:</td>
<td>
<asp:TextBox
ID="txtnombre"
runat="server"></asp:TextBox>
</td>
<td>apellido:</td>
<td>
<asp:TextBox
ID="txtape"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Activo
</td>
<td>
<asp:CheckBox
ID="ckactivo"
runat="server"
Text=""
/>
</td>
<td
colspan="2"
style="text-align:
right">
<asp:Button
ID="Button2"
runat="server"
Text="Guardar"
OnClick="Button2_Click"
/>
</td>
</tr>
</table>
</fieldset>
<br
/>
<br
/>
<fieldset>
<legend>Actualizar
Datos</legend>
<table>
<tr>
<td>Nombre:</td>
<td>
<asp:TextBox
ID="TextBox1"
runat="server"></asp:TextBox>
</td>
<td>apellido:</td>
<td>
<asp:TextBox
ID="TextBox2"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Activo
</td>
<td>
<asp:CheckBox
ID="CheckBox1"
runat="server"
Text=""
/>
</td>
<td
colspan="2"
style="text-align:
right">
<asp:Button
ID="Button3"
runat="server"
Text="Guardar"
OnClick="Button3_Click"
/>
</td>
</tr>
</table>
</fieldset>
</td>
<td>
<fieldset>
<legend>Visualizar
datos</legend>
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateSelectButton="true"
OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
<selectedrowstyle
backcolor="LightCyan"
forecolor="DarkBlue"
font-bold="true"/>
</asp:GridView>
</fieldset>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
En la página para el código (code
behind -- consumo.aspx.cs) vamos ir explicando parte por parte:
Lo primero debemos heredar la clase
SoapClient
ya que esta la usaremos para solicitar y
responder al servicio web
ServiceReference1.Service1SoapClient
servicioasp = new
ServiceReference1.Service1SoapClient();
Luego
declaramos una variables para manejo de errores
string
error;
Con
esto estamos listo para usar los métodos del servicio web, vamos a
crear una función que muestre los datos la persona la cual llamaremos
en el load de la página (esto es un ejemplo sencillo no estoy
validando si es o no postback en el load) y esta información se la
paremos a un grid.
protected
void
Page_Load(object
sender, EventArgs
e)
{
mostrardatos();
}
public
void
mostrardatos()
{
try
{
GridView1.DataSource
= servicioasp.SelectRow();
GridView1.DataBind();
}
catch
(Exception
ex) {
error
= ex.Message;
}
}
Muy
fácil verdad… :)
Bueno
para insertar cuando den click en el botón vamos a validar que no
estén vacíos los textbox luego llamamos al método que hace en el
insert en el web service, en esta función estamos llamando un
javascript desde el código behind para mostrar un alerta…
protected
void
Button2_Click(object
sender, EventArgs
e)
{
bool
w_activo = true;
if
(ckactivo.Checked != true)
{
w_activo
= false;
}
if
(string.IsNullOrEmpty(txtnombre.Text.Trim())
== true)
{
ClientScript.RegisterStartupScript(this.GetType(),
"sinnombre",
"sinnombre();",
true);
return;
}
if
(string.IsNullOrEmpty(txtape.Text.Trim())
== true)
{
ClientScript.RegisterStartupScript(this.GetType(),
"sinape",
"sinape();",
true);
return;
}
try
{
servicioasp.InsertRow(txtnombre.Text,
txtape.Text, w_activo);
txtnombre.Text
= "";
txtape.Text
= "";
mostrardatos();
}
catch
(Exception
ex)
{
error
= ex.Message;
}
}
Para
la actualización hay que hacer lo siguiente en el grid activar que
puedan seleccionar la fila para poder tomar el dato que están
seleccionando y pasar esto a los textbox donde la información va
hacer cambiada.
Activamos
en el grid: AutoGenerateSelectButton="true"
Luego
en el evento GridView1_SelectedIndexChanged
tomamos los datos seleccionado, solo que hay que explicar algo en
este asunto el web service nos regresa el nombre separado del
apellido por do rayas (--) y en una sola cadena debemos separar esta
información para ponerla en dos textbox diferente, esto es muy
sencillo solo debemos saber la posición que ocupa la rayita y con
la función substring extraer el nombre y luego el apellido,
Comprediendo esto nos vamos al evento antes mecionado
protected
void
GridView1_SelectedIndexChanged(object
sender, EventArgs
e)
{
//Variable
que guardara la cadena que esta en el grid o fila seleccionada
string
persona;
//Variable
que guardara la fila seleccionada
GridViewRow
row = GridView1.SelectedRow;
//Guardamos
el texto donde esta la informacion de la persona
persona
= row.Cells[1].Text;
//En
el textbox 1 guardamos el nombre que va en la cadena desde el inicio
hata la -
TextBox1.Text
= persona.Substring(0,persona.IndexOf('-'));
//Variable
que guardara la posicion de primera -
int
i;
//Variable
que guarda el tamaño de la cadena a extraer
int
j;
//Posicion
inicio del apellido
i
= persona.IndexOf('-')
+ 2; //Sumo
2 posicones por que el nombre y el apellido estan separados por dos
rayas (--)
//Tamaño
del apellido
j
= persona.Length - i;
//Guardamos
en el textbox 2 el apellido
TextBox2.Text
= persona.Substring(i,j);
}
Con
esto la información del grid debe mostrarse en los textbox. Aquí
hay un detalle el web service no nos regresa el id de la persona para
poder hacer el update, así
que tendremos que traerlo guardarlo en una variable de sesión y usar
el id cuando le den click al botón de actulizar… Entonces
el evento GridView1_SelectedIndexChanged
no quedara así:
protected
void
GridView1_SelectedIndexChanged(object
sender, EventArgs
e)
{
//Variable
que guardara la cadena que esta en el grid o fila seleccionada
string
persona;
//Variable
que guardara la fila seleccionada
GridViewRow
row = GridView1.SelectedRow;
//Guardamos
el texto donde esta la informacion de la persona
persona
= row.Cells[1].Text;
//En
el textbox 1 guardamos el nombre que va en la cadena desde el inicio
hata la -
TextBox1.Text
= persona.Substring(0,persona.IndexOf('-'));
//Variable
que guardara la posicion de primera -
int
i;
//Variable
que guarda el tamaño de la cadena a extraer
int
j;
//Posicion
inicio del apellido
i
= persona.IndexOf('-')
+ 2; //Sumo
2 posicones por que el nombre y el apellido estan separados por dos
rayas (--)
//Tamaño
del apellido
j
= persona.Length - i;
//Guardamos
en el textbox 2 el apellido
TextBox2.Text
= persona.Substring(i,j);
//Esto
es por que en el web service no me regresa el id
SqlConnection
conn = new
SqlConnection(conexion());
SqlCommand
cmd = new
SqlCommand("select
idpersona from persona where nombre = @nombre and apellido =
@apellido",
conn);
cmd.Parameters.Add("@nombre",
SqlDbType.NVarChar,
50).Value = TextBox1.Text.Trim();
cmd.Parameters.Add("@apellido",
SqlDbType.NVarChar,
50).Value = TextBox2.Text.Trim();
SqlDataAdapter
da = new
SqlDataAdapter();
da.SelectCommand
= cmd;
DataTable
dt = new
DataTable();
da.Fill(dt);
foreach
(DataRow
r in
dt.Rows)
{
Session["id"]
= r["idpersona"];
}
}
private
string
conexion()
{
string
cadena = @"Data
Source=.;Initial Catalog=BD;user id = USUARIO; password =
CONTRASEÑA*";
return
cadena;
}
También
el web service no regresa el estado de la persona la cual podíamos
traerlo con el id y pasarlo al checkbox pero para no hacer más
grande el ejemplo lo dejaremos así…
Luego
en el evento click de la acción actulizar validamos siempre que los
campos no estén vacios y llamamos al método de actulizar del web
service
protected
void
Button3_Click(object
sender, EventArgs
e)
{
bool
w_activo = true;
if
(ckactivo.Checked != true)
{
w_activo
= false;
}
if
(string.IsNullOrEmpty(TextBox1.Text.Trim())
== true)
{
ClientScript.RegisterStartupScript(this.GetType(),
"sinnombre",
"sinnombre();",
true);
return;
}
if
(string.IsNullOrEmpty(TextBox2.Text.Trim())
== true)
{
ClientScript.RegisterStartupScript(this.GetType(),
"sinape",
"sinape();",
true);
return;
}
try
{
servicioasp.UpdateRow(TextBox1.Text.Trim(),
TextBox2.Text.Trim(), w_activo,Convert.ToInt32(Session["id"]));
mostrardatos();
TextBox1.Text
= "";
TextBox2.Text
= "";
}
catch
(Exception
ex)
{
error
= ex.Message;
}
}
Pueden
observar que después del insert y update llamamos a la función
mostrardatos()
para actualizar los datos en el grid.
Ejecutamos
nuestra aplicación y de entrada el grid tiene que ser llenado aquí
ya consumimos el web service :)
Y listo con esto terminamos el
ejemplo de cómo consumir un web services … Saludos