Genesis Vargas J

Como hacer un Webservice en C# y consumirlo en página PHP y ASP.NET

Comparte:

Hola que tal amigos, en esta ocasión les traigo un tutorial muy bueno que se divide en 2; la primera parte es la creación de un Webservice (Servicio Web) en .NET(C#) y la segunda parte es consumir ese webservice en una página web ASP.NET o también en una página web PHP.

El objetivo de este ejemplo es ver lo versátil que puede ser este servicio web creado en .NET y su funcionamiento con distintos lenguajes de programación o aplicaciones diferentes (websites o programas de computador). Este servicio web va a insertar y a consultar datos que en esta ocasión van a ser los mismos de la base de datos del tutorial pasado que desarrolle para consultar, eliminar e insertar datos desde ASP.NET a una base de datos SQL server.

Para empezar la careación del Webservice vamos a abrir Visual Studio 2013, creamos un proyecto web de ASP.NET Vacío y procedemos a agregar un webservice(ASMX).

Cuando ya este creado nuestro archivo asmx. empezamos a codificarlo de la siguiente manera:

ServicioWebDatosCliente.asmx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data;
using System.Data.SqlClient;

namespace WebServiceDatosCliente
{
    /// 
    /// Summary description for ServicioWebDatosCliente
    /// 
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class ServicioWebDatosCliente : System.Web.Services.WebService
    {
        private SqlConnection con;
        private SqlDataAdapter da = new SqlDataAdapter();
        private DataTable dt = new DataTable();
        private SqlCommand cmd;
        public SqlDataReader dr;

        private void Conectar()
        {
            con = new SqlConnection("server=localhost;user=sa;pwd;123456;initial catalog=registro");
            con.Open();
        }

        private void Desconectar()
        {
            con.Close();
        }

        private void CrearComando(String consulta)
        {
            cmd = new SqlCommand(consulta, con);
        }

        private void AsignarParametro(string param, SqlDbType tipo, object value)
        {
            cmd.Parameters.Add(param, tipo).Value = value;
        }

        private int EjecutarConsulta()
        {
            int numReg;
            numReg = cmd.ExecuteNonQuery();
            return numReg;
        }

        [WebMethod]
        public bool InsertaDatosClientes(string nom, string tel, string ciu)
        {
            bool inserto;
            Conectar();
            CrearComando("INSERT INTO Registro(Nombre,Telefono,Ciudad) VALUES(@nom,@tel,@ciu);");
            AsignarParametro("@nom", SqlDbType.VarChar, nom);
            AsignarParametro("@tel", SqlDbType.VarChar, tel);
            AsignarParametro("@ciu", SqlDbType.VarChar, ciu);
            if (EjecutarConsulta() > 0)
            {
                inserto = true;
            }
            else
            {
                inserto = false;
            }
            con.Close();
            return inserto;
        }

        [WebMethod]
        public List ConsultaDatosClientes()
        {
            List lista = new List();
            Conectar();
            CrearComando("SELECT * FROM Registro");
            da.SelectCommand = cmd;
            try
            {
                da.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    lista.Add(dr["Nombre"].ToString());
                    lista.Add(dr["Telefono"].ToString());
                    lista.Add(dr["Ciudad"].ToString());
                }
            }
            catch (System.Exception ex)
            {
                string error = "Error: " + ex.Message;
            }
            return lista;

        }
    }
}

En el código del servicio web importamos los espacios de nombres para trabajar con sql server: system.data y system.data.sqlclient, escribimos el código básico para manejar nuestra base de datos y creamos 2 métodos: InsertaDatosClientes y ConsultaDatosCliente; en el primer método le pasamos los 3 parámetros que vamos a insertar en la tabla del registro de clientes y en el otro método vamos a devolver una lista con todos los registros que tenga la tabla que al final se va a mostrar como una vista xml.

Terminado este archivo compilamos el proyecto y ejecutamos para ver el servicio web en funcionamiento. SI LO ESTAS HACIENDO DEBES TENER CREADA LA BASE DE DATOS CON LA ESTRUCTURA (TE ACONSEJO QUE SI NO VISTE EL TUTORIAL PASADO DESCARGUES TODOS LOS EJEMPLOS EN ESTE TUTORIAL, PORQUE EN LA DESCARGA DEL WEBSERVICE ESTA EL SCRIPT DE LA BASE DE DATOS SQL SERVER PD: POR FAVOR VERIFICA QUE TIENES TU CADENA DE CONEXION BIEN ESCRITA)

Allí se ve el servicio web con los dos métodos, y en la siguiente captura se escogio el método ConsultaDatosClientes, se le invocó y nos mostro los datos en XML.

Hasta aquí hemos creado el servicio web en C# (.NET), ahora vamos a crear un cliente en PHP y un cliente en ASP.NET para consumirlo, así que continuamos con el que puede parecer un intruso: PHP.
Para hacer esta tarea vamos a utilizar la clase NuSoap de PHP y procedemos a escribir nuestra pagina PHP.

ClienteWebService.PHP

<?php
include('nusoap.php');
$client = new nusoap_client('http://genesisvargasj.somee.com/ServicioWebDatosCliente.asmx?WSDL',true);
if(isset($_POST["boton"]))
{
	if($_POST["nombre"] == "" || $_POST["telefono"] == "" || $_POST["ciudad"] == "")
	{
		echo 'por favor rellena los datos del cliente';
	}
	else
	{
		$param=array(
			'nom'=>$_POST["nombre"],
			'tel'=>$_POST["telefono"],
			'ciu'=>$_POST["ciudad"]
		); 
		print_r($client->call('InsertaDatosClientes', $param));
	}
}
$result = $client->call('ConsultaDatosClientes');
$col = ceil(count($result,1)/count($result,0))- 1;
$j = 0;
echo '<h1>Resultados del Servicio Web hecho en C# .NET</h1>';
echo '<h2>ConsultaDatosClientes:</h2>';
echo '<table style="border:1px solid #000">
		<tr>
			<td>Nombre</td>
			<td>Telefono</td>
			<td>Ciudad</td>
		</tr>';
for($i=0; $i < ($col - 1); $i++)
{
	$j++;
	if($j == 4)
	{
		echo "</tr>";
		$j = 1;
	}
	if($j == 1)
	{
		echo "<tr>";
	}
	echo '<td style="border:1px solid #000">'.$result["ConsultaDatosClientesResult"]["string"][$i]."</td>";
}
echo '</table>';
echo '<h2>InsertaDatosClientes:</h2>';
echo   '<form method="POST" action="">
			<fieldset>
				<legend>Escriba los datos del cliente a guardar:</legend>
				<label>Nombre:</label>
				<input type="text" name="nombre" value="" required>
				<label>Telefono:</label>
				<input type="text" name="telefono" value="" required>
				<label>Ciudad:</label>
				<input type="text" name="ciudad" value="" required>
				<p><input type="submit" value="Guardar Cliente" name="boton"></p>
			</fieldset>
		</form>';
?>

Analizando el código podemos observar que incluimos la clase NuSoap y creamos un objeto de ella pasandole la url de nuestro webservice (en este caso yo tengo el servicio web en internet y si gustas lo puedes usar), luego esta un condicional para que se ejecute cuando se inserten los datos para el método InsertaDatosClientes a traves del formulario que se vería en la página, como éste método lleva 3 parametros creamos un array que va a tener los mismos nombres de los parámetros que creamos en nuestro webservice y le asignamos los valores que recogerá el formulario con POST para finalmente utilizar la función call del objeto de la clase NuSoap y pasarle el conmbre del método y los parámetros. Mas abajo tambien utilizamos la función call para llamar al otro método: ConsultaDatosClientes y lo asignamos en una variable $result, creamos una variable para saber cuantos bloques trae éste método (como lo declaramos como una lista string, todo la va a devolver como string) y ponemos a funcionar nuestra recursividad: hacemos un for del 1 hasta el numero de bloques que recibimos menos 1 y utilizamos un contador para guíarnos a traves de la tabla que vamos a mostrar con los datos del método del webservice, aumentamos el contador y estamos en el primer registro, hacemos dos condicionales if (uno proguntado si el contador es igual a 4 para escribir el final de la etiqueta tr: fila y dejar el contador en 1 y el otro preguntando si el comtador es igual a 1 para escribir el inicio de la etiqueta tr) y seguidamente imprimimos una columna o etiqueta td con el resulado de lo que trae string (recuerda que la respuesta en xml te va a mostrar que todo se devolvera entre etiquetas string, por eso nos vamos a basar en ese indicador a traves de la columna del for). Con esta "recursividad" logramos imprimir una tabla ordenada con los registros que nos devuelve el método del webservice y finalmente imprimimos el formulario que se encargará de guardar datos a traves del primer método que explicamos mas arriba.

Ahora vamos con el cliente que va a consumir ese servicio web en Asp.Net para esto vamos a usar el mismo proyecto donde creamos nuestro webservice; y vamos a agregar la referencia de servicio de nuestro webservice para que quede todo configurado.

y vamos a añadirle un nuevo elemento que en este caso sería un webform y lo vamos a codificar así:

ClienteWebService.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ClienteWebService.aspx.cs" Inherits="WebServiceDatosCliente.ClienteWebService" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Cliente Asp.Net WebService C#</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Resultados del Servicio Web hecho en C# .NET</h1>
        <h2>InsertaDatosClientes:</h2>
        <h4>Escriba los datos del cliente a guardar:</h4>
        <asp:Label ID="LblResp" runat="server" Text="Label"></asp:Label>
        <p>Nombre:</p>
		<asp:TextBox ID="TxtNombre" runat="server" required></asp:TextBox>
        <p>Teefono:</p>
		<asp:TextBox ID="TxtTelefono" runat="server" required></asp:TextBox>
		<p>Ciudad:</p>
		<asp:TextBox ID="TxtCiudad" runat="server" required></asp:TextBox>
        <p><asp:Button ID="BtnGuardar" runat="server" Text="Guardar Cliente" OnClick="BtnGuardar_Click" /></p>
        <h2>ConsultaDatosClientes:</h2>
        <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>

Como ven este archivo tenemos exactamente igual la estructura del otro cliente realizado en PHP: un formulario que será procesado para utilizar el método InsertaDatosClients con los parámetros correspondiente de las cajas de texto y abajo ponemos un literal que nos servira para mostrar la tabla html con los registros que encontremos en el método que consulta. Ahora nuestro archivo que maneja este webform quedará codificado de la siguiente manera:

ClienteWebService.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebServiceDatosCliente.ServiceReference1;
using System.Data;

namespace WebServiceDatosCliente
{
    public partial class ClienteWebService : System.Web.UI.Page
    {
        ServicioWebDatosCliente ws = new ServicioWebDatosCliente();

        protected void Page_Load(object sender, EventArgs e)
        {
            Literal1.Text = CrearTabla(ws.ConsultaDatosClientes());
        }

        protected void BtnGuardar_Click(object sender, EventArgs e)
        {
            if(TxtNombre.Text == "" || TxtTelefono.Text == "" || TxtCiudad.Text == "")
	        {
		        LblResp.Text = "por favor rellena los datos del cliente";
	        }
	        else
	        {
                LblResp.Text = ws.InsertaDatosClientes(TxtNombre.Text, TxtTelefono.Text, TxtCiudad.Text).ToString();
	        }
        }

        static string CrearTabla(List<string> list)
        {
            string html;
            html = "<table style='border:1px solid #000'><tr><td>Nombre</td><td>Telefono</td><td>Ciudad</td></tr>";
            int i, j = 0;
            for (i = 0; i < list.Count; i++)
            {
                j++;
                if(j == 4)
                {
                    html += "</tr>";
		            j = 1;
	            }
                if(j == 1)
	            {
		            html +=  "<tr>";
	            }
                html += "<td style='border:1px solid #000'>" + list[i] + "</td>";
            }
            return html;
        }
    }
}

Si observamos el código nos daremos cuenta que importamos la referencia de servicio que montamos al principio de la creación del cliente Asp.Net y cramos un objeto de la clase del servicio web; en el evento de load de la página le asignamos al literal la función CrearTabla que recibe como parámetro el método que consulta, es decir que la función recibe un List. Mas abajo mirando detalladamente la función CrearTabla podemos apreciar que utilizamos la misma recursividad que con el cliente PHP, porque hacemos el mismo for y en vez de imprimir con echo (en PHP), acá se lo agregamos a la variable html que a su vez se retornara al llamar la función; lo mismo pasa en el evento del click del boton guardar para que se llame al método que inserta con los parámetros que recoga de los TextBox.

Bueno eso es todo espero que les sirva mucho para aprender y practicar.

Comentarios


genesis vargas

Soy Genesis Vargas Jiménez, autor de éste blog. Me gusta desarrollar software en todas las plataformas (web, móvil y desktop) y compartir conocimiento para ayudar a muchas personas.

Desde el 2015 soy MVP Microsoft en Visual Studio y tecnologías de desarrollo, reconocimiento que me enorgullece mucho.

MVP Genesis Vargas J

A PHP Error was encountered

Severity: Core Warning

Message: Module 'timezonedb' already loaded

Filename: Unknown

Line Number: 0

Backtrace: