Curso sobre programacion c# y Visual Studio 2019. En este blog veremos tutoriales para aprender a crear nuestras aplicaciones de consola,aplicaciones web, SQL , Tensorflow y Machine Learning
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con con nuestro API REST. Recordando la definición deAPI REST, podemos decir que es cualquier interfaz entre sistemas que use HTTP para obtener datos o
generar operaciones sobre esos datos en todos los formatos posibles,
como XML y JSON. Es una alternativa a otros protocolos estándar
de intercambio de datos como SOAP (Simple Object Access Protocol).
- En esta entrada vamos a crearnos un método POST. Con este método podremos almacenar nuevos usuarios en nuestra bases de datos haciendo peticiones desde diferentes cliente. En el video muestro un ejemplo con el código:
- En el video hemos visto como crear un método POST. En la siguiente entrada del blog veremos como consumir este método desde un cliente. Por el momento os dejo el código que hemos visto en el video.
Clase usuario:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Pruebas.Models
{
public class Usuario
{
string nombre = String.Empty;
string email = String.Empty;
byte[] pass = null;
string codPais = String.Empty;
public string Nombre { get => nombre; set => nombre = value; }
public string Email { get => email; set => email = value; }
public byte[] Pass { get => pass; set => pass = value; }
public string CodPais { get => codPais; set => codPais = value; }
}
}
Controlador UsuarioController:
using Pruebas.Models;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace Pruebas.Controllers
{
public class UsuarioController : ApiController
{
public Boolean AltaUsuario(Usuario u)
{
Boolean todoOk = false;
SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
54-.Servicios Web.API REST. MVC- Consumiendo Método Get
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios web. En esta entrada vamos a consumir desde un cliente el método get que
nos devuelva todos los pedidos que tenemos almacenados en nuestra base
de datos.
- En la anterior entrada aprendimos a definir un método dentro de un API /REST. En esta ocasión llamamos a este método desde un cliente mediante una llamada del tipo http://localhost:57963/API/PEDIDOS/. De esta forma podemos obtener los pedidos que tenemos almacenados en nuestra base de datos, sin necesidad de acceder directamente a la base de datos desde nuestro cliente.
- En el video podéis ver el ejemplo:
- Como hemos visto en el video podemos obtener los valores de un origen de datos sin necesidad de acceder directamente a la base de datos de la que queremos obtener los datos. La comunicación entre el cliente y el web service suele hacerse enviando y recibiendo los datos en formato JSON. Es de utilidad para trabajar con este formato agregar al proyecto la referencia Newtonsoft.Json que nos permite trabajar de una manera ágil con este tipo de datos.
using Newtonsoft.Json;
using System;
using System.Collections.Generic; using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GestionVarios
{
public partial class APIREST : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Usuario u = new Usuario();
u.Nombre = "Bart Simpson";
u.Email = "BartSimpson@email.com";
u.CodPais = "ARG";
u.Pass = cifrar("BART");
JsonSerializerSettings ConfigJson = new JsonSerializerSettings(); //Evitar que se serialicen los nodos cuyo valor sea nulo (Los ignora).
ConfigJson.NullValueHandling = NullValueHandling.Ignore;
byte[] Datos = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(u, Formatting.None, ConfigJson));
HttpWebResponse res = (HttpWebResponse)WReq.GetResponse();
Encoding Codificacion = ASCIIEncoding.UTF8;
StreamReader SReader = new StreamReader(res.GetResponseStream(), Codificacion);
ResultadoCadena = SReader.ReadToEnd();
lblResultado.Text = ResultadoCadena;
}
private byte[] cifrar(string cadenaAcifrar)
{
String miclave = ConfigurationManager.AppSettings["clave"];
byte[] claveCifrado = System.Text.Encoding.ASCII.GetBytes(miclave);
Cifrado c = new Cifrado(claveCifrado);
byte[] b = c.cifrar(cadenaAcifrar);
return b;
}
}
}
public class Usuario
{
string nombre = String.Empty;
string email = String.Empty;
byte[] pass = null;
string codPais = String.Empty;
public string Nombre { get => nombre; set => nombre = value; }
public string Email { get => email; set => email = value; }
public byte[] Pass { get => pass; set => pass = value; }
public string CodPais { get => codPais; set => codPais = value; }
}
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios web.En esta ocación vamos a empezar a crear un API REST. Como definición podemos decir que es cualquier interfaz entre sistemas que use HTTP para obtener datos o
generar operaciones sobre esos datos en todos los formatos posibles,
como XML y JSON. Es una alternativa a otros protocolos estándar
de intercambio de datos como SOAP (Simple Object Access Protocol).
- En esta entrada vamos a crearnos un método get que nos devuelva todos los pedidos que tenemos almacenados en nuestra base de datos.Estos métodos se definen para que los clientes que invoquen a nuestra API puedan obtener los datos que nosotros queramos darles. En este caso en el video vemos como crear un método que posteriormente consumiremos desde un cliente.
- Como hemos visto en el video primero creamos un proyecto de tipo Web API. Después creamos dentro de nuestra carpeta Models una clase llamada Pedidos:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Pruebas.Models
{
public class Pedidos
{
private string nomreCliente;
string fechaPedido;
public string NomreCliente { get => nomreCliente; set => nomreCliente = value; }
public string FechaPedido { get => fechaPedido; set => fechaPedido = value; }
}
}
- Debemos agregar también un controlador para trabajar con los pedidos. De momento la clase tendrá un método que nos devuelva una lista con todos los pedidos almacenados. El código fuente es el siguiente:
using Pruebas.Models;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace Pruebas.Controllers
{
public class PedidosController : ApiController
{
public List<Pedidos> getPedidos()
{
List<Pedidos> pedidosController = new List<Pedidos>();
SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios web.En esta ocación vamos a añadir un método más a nuestro servicio web para continuar practicando.
- En entradas anteriores del blog teniamos hecha la lógica para dar de alta un usuario en nuestra base de datos.Vamos a añadir al servicio web este método con su correspondiente lógica para guardar en base de datos.Además vamos a proceder a llamar al nuevo método recien implementado desde nuestro cliente.
- En el video muestro este proceso:
- Os dejo el código de ejemplo desglsoado por partes.
Nuevo método de Alta de Usuario de nuestro web service
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
finally
{
if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
conexion.Close();
conexion.Dispose();
}
}
else todoOk = false;
return todoOk;
}
Llamada para el alta de ususario desde nuestro cliente.Código de la parte de servidor:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GestionVarios
{
public partial class AltaUsuario : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios web. Puede ser que no queramos que los métodos de nuestro web service esten accesibles para todo el mundo que conozca la url del servicio al que se realiza la petición. En este caso podemos poner algún mecanismo para validar que quien accede a nuestro web service, es alguien en el que confiamos.
- Uno de las formas de validación más antiguas son las cabeceras SOAP. Los nuevos servicios web suelen hacerse con WCF. Pero en esta entrada del blog vamos a ver un ejemplo de la antigua autenticación SOAP. En el video muestro un ejemplo sobre como poder utilizar las cabeceresa soap en el web service y como realizar la llamada desde un cliente.
- En primer lugar añadimos la cabecera [SoapHeader("Authentication")] al método que queramos securizar:
[WebMethod] [SoapHeader("Authentication")]
public List<Pedidos> DamePedidos()
{ ...}
- En segundo lugar nos creamos una clase que herede de SoapHeader, como por ejemplo esta:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services.Protocols;
namespace ServicioWebPruebas
{
public class AuthHeader : SoapHeader
{
public string usuario;
public string pass;
}
}
- En tercer lugar implementamos la validación en el método que queramos securizar:
public AuthHeader Authentication;
[WebMethod] [SoapHeader("Authentication")] public List<Pedidos> DamePedidos() {
List<Pedidos> listaPedidos = new List<Pedidos>();
SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
if (Authentication.usuario == ConfigurationManager.AppSettings["Usuario"].ToString() && Authentication.pass == ConfigurationManager.AppSettings["Pass"].ToString())
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
finally
{
if (Con.State == ConnectionState.Open)
Con.Close();
Con.Dispose();
}
}
return listaPedidos;
}
}
- Una vez tenemos echo esto, será necesario para poder consumir el método del web service pasar un usuario y una password.Por ejemplo la llamada a este método desde un cliente sería:
WSPruebas.Pruebas pruebas = new WSPruebas.Pruebas();
pruebas.AuthHeaderValue = new WSPruebas.AuthHeader();
pruebas.AuthHeaderValue.pass = "pass";
pruebas.AuthHeaderValue.usuario = "pepe";
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios web. En ocasiones, puede
ser que necesitemos cierta funcionalidad
que nos permitan intercomunicar sistemas o obtener datos de otros sistemas.Los servicios web
proporcionan mecanismos de comunicación estándares entre diferentes
aplicaciones, que interactúan entre sí para presentar información
dinámica al usuario.
- En el ejemplo que muestro en el video la arquitectura que se pretende simular es similar a la siguiente con la salvedad que en mi caso lo tengo todo montado en mi máquina local:
- Con esta arquitectura el cliente se comunica con el servidor web que tiene alojada la página que el usuario está consumiendo. La página llama a un web service para obtener los datos necesarios(en nuestro ejemplo una lista de pedidos) y es el web service el que se comunica con la base de datos para obtener los datos necesarios que el usuario finalmente visualiza en su navegador.
Os dejo el video con el ejmplo:
- De esta forma podemos tener la bbdd en una máquina, el web service en otra y la página que ve el usuarioen otra, con lo que conseguimos interoperabilidad entre aplicaciones de software independientemente de sus propiedades o de las plataformas sobre las que se instalen.
- Os dejo por aqui también la clase que llama al web service una vez tenemos agregada la referencia en nuestro proyecto:
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a empezar a conocer los servicios web. En ocasiones, puede
ser que necesitemos cierta funcionalidad
que nos permitan intercomunicar sistemas o obtener datos de otros sistemas.Los servicios web proporcionan mecanismos de comunicación estándares entre diferentes aplicaciones, que interactúan entre sí para presentar información dinámica al usuario. Los servicios web proporcionan interoperabilidad y extensibilidad entre estas aplicaciones, y que al mismo tiempo sea posible su combinación para realizar operaciones complejas.
-
En el video os muestro como crear un proyecto del tipo web service,
como agregarle de una manera sencilla la capacidad de obtener datos de una base de datos SQL, y de esta manera tener preparado un método del web service para ser consumido posteriormente por un cliente.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ServicioWebPruebas
{
public class Pedidos
{
DateTime FechaPedido;
String nombreUsuario;
public DateTime FechaPedido1 { get => FechaPedido; set => FechaPedido = value; }
public string NombreUsuario { get => nombreUsuario; set => nombreUsuario = value; }
}
}
Clase Pruebas.asmx
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace ServicioWebPruebas
{
/// <summary>
/// Descripción breve de Pruebas
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// Para permitir que se llame a este servicio web desde un script, usando ASP.NET AJAX, quite la marca de comentario de la línea siguiente.
// [System.Web.Script.Services.ScriptService]
public class Pruebas : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hola a todos";
}
[WebMethod]
public List<Pedidos> DamePedidos()
{
SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
List<Pedidos> listaPedidos = new List<Pedidos>();
try
{
Con.Open();
SqlCommand Com = Con.CreateCommand();
Com.CommandText = "[DamePedidos]";
Com.CommandType = CommandType.StoredProcedure;
SqlDataReader reader = Com.ExecuteReader();
while (reader.Read())
{
Pedidos pedAuc = new Pedidos();
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios windows. Hemos
implementado una mínima lógica en el servicio windows para probar que una
vez instalado en nuestra máquina ejecuta el código y escribe en un fichero en disco cada x segundos.
-Los servicios windows
son una buena solución para ejecutar tareas que no requieran interfaz
gráfica, ni ninguna interacción con los usuarios y que tengan como
objetivo realizar tareas en un segundo plano.Pero tienen el problema que no se se depurar dando al botón de "Play" del proyecto, aunque si se puede depurar un servicio de Windows si se inicia el servicio y se asocia el depurador al proceso del servicio. En el video podéis ver como lo asocio:
Como resumen de estos tres capítulos del curso donde hemos trabajado con un servicio windows os dejo lo más importante:
Al compilar un servicio windows se genera un ejecutable .exe.
Se puede instalar en un sistema windows con la herramienta InstallUtil.exe del framework de microsoft.
Se puede depurar después de instalarlo asociandolo al proceso correspondiente, desde Visual Studio.
Os dejo el código del ejemplo una vez corregido:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ServciosWindowsPrueba
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
var worker = new Thread(Iniciar);
worker.Name = "Prueba";
worker.IsBackground = false;
worker.Start();
}
void Iniciar()
{
Log l = new Log();
int milisegundos = 15000;
try
{
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a continuar con los servicios windows. Vamos a implementar una mínima lógica en el servicio windows para probar que una vez instalado en nuestra máquina ejecuta el código de la misma manera que otras aplicaciones que hemos desarrollado aquí anteriormente, como por ejemplo las aplicaciones de consola.
-Los servicios windows son una buena solución para ejecutar tareas que no requieran interfaz gráfica, ni ninguna interacción con los usuarios y que tengan como objetivo realizar tareas en un segundo plano.En nuestor ejemplo simplemente vamos a hacer que una vez arrancado el servcio escriba en un fichero en disco cada x segundos.En el video podéis ver el ejemplo.
- En esta ocasión os dejo el código de la clase principal, que se inicia al arrancar el servicio.La parte del código que escribe en un fichero en disco os la dejo a vosotros. De todas formas en entradas anteriores del blog hay ejemplos.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ServciosWindowsPrueba
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
var worker = new Thread(Iniciar);
worker.Name = "Prueba";
worker.IsBackground = false;
worker.Start();
}
void Iniciar()
{
Log l = new Log();
int milisegundos = 15000;
try
{
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a empezar con los servicios windows. En ocasiones, puede
ser que necesitemos cierta funcionalidad
que no necesite una interfaz gráfica y que este siempre corriendo en un segundo plano, para este caso los servicios windows puede ser una buena solucion.
- En el video os muestro como crear un proyecto del tipo windows service, como agregarle de una manera sencilla la capacidad para ser instalado en una máquina y como instalarlo desde línea de comandos con la herramienta installUtil.exe, que tenemos disponible en los diferentes frameworks de Microsoft.NET.
- Como habéis observado en el video una vez compilado el proyecto nos genera un fichero con extensión exe. Este fichero es el que debemos instalar mediante la herramienta installUtil.exe, siguiendo los siguientes pasos:
Primero abrimos un cmd con permisos de administrador.
Una vez tenemos hecho esto nos vamos a la ruta donde esta la herramienta de instalación que nos proporciona el framework de .net, en nuestro caso esta aquí:
3. Una vez estemos en la ruta donde esta la herramienta installUtil ejecutamos una sentencia similar a la siguiente para instalar el servicio en nuestra máquina:
installutil ruta_ejecutable\nuestroproyecto.exe
* Si queremos desinstalar el servicio basta ejecutar la misma senetecia pero añadiendo /u al final.
Os dejo además un par de enlaces a sites de Microsofto con más información sobre los servicios:
- En este capítulo del curso de programación en c# con visual studio
2017,vamos a ver los controles de usuario. En ocasiones, puede ser que necesitemos cierta funcionalidad
que no está incluida en los controles que vienen por defecto incluidos en Visual Studio. En estos casos, podemos crear nuestros propios controles agregando a nuestro proyecto un objeto ascx.
- Un control de usuario es similar a una página Web (archivo .aspx) e incluye una página de interfaz de usuario y
código. El proceso de creación del control de usuario es muy similar al
proceso de creación de una página ASP.NET, sólo que al final se agregan
el formato y los controles secundarios necesarios.
- En el video os dejo un ejemplo sobre como crear un control ascx y como agregar a una página aspx:
- Un control de usuario se diferencia de una página Web ASP.NET en los siguientes aspectos:
La extensión de nombre de archivo es .ascx.
Los controles de usuario no se pueden ejecutar como archivos independientes.
El control de usuario no contiene elementos html, body o form. Estos elementos deben estar en la página de alojamiento.