Servicio WCF con XML
Pero primero, ¿Qué es WCF?
Es el framework para la creación de aplicaciones orientadas a servicios web y clientes de servicios web de Microsoft. Con WCF, es posible enviar datos como mensajes asíncronos de un servicio a otro. Los mensajes pueden ser tan simples como un carácter o una palabra enviados como XML, o tan complejos como un flujo de datos binarios.
Una vez aclarado más o menos lo que es WCF y para qué sirve, pasemos a la creación de un servicio WCF.
Primero, crearemos el proyecto que será Class Library (.NET Framework) (IMPORTANTE no crear una librería .NET Standard porque no nos funcionaria). Le ponemos el nombre que queramos en mi caso es LogicaDatos.
Una vez creado le damos click derecho sobre References y añadimos las dos referencias necesarias, en este caso son System.ServiceModel y System.Runtime.Serialization.
Ahora agregamos al proyecto el archivo XML que vamos a consumir en mi caso es alumnos.xml.
Y en propiedades sobre Build Action le ponemos Embedded Resource.
Ahora creamos la clase que contendrá los datos que extraigamos del XML. En mi caso la he llamado Alumno.cs y utilizamos DataContract para la clase y DataMember para las propiedades.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace LogicaAlumnos
{
[DataContract]
public class Alumno
{
[DataMember]
public int IdAlumno { get; set; }
[DataMember]
public String Nombre { get; set; }
[DataMember]
public String Apellidos { get; set; }
[DataMember]
public int Nota { get; set; }
}
}
Una vez creado lo anterior nos creamos el servicio. Primero crearemos la interfaz del servicio, que yo lo he llamado IServicioAlumno.cs que será la interfaz del servicio donde irán las dos clases con sus consultas.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace LogicaDatos
{
[ServiceContract]
public interface IServicioAlumno
{
[OperationContract]
List<Alumno> GetAlumnos();
[OperationContract]
Alumno BuscarAlumno(int idalumno);
}
}
Ahora crearemos el servicio que contendrá la lógica del servicio WCF y que implementara los métodos. Yo lo he llamado ServicioAlumnos.cs y lo heredamos de la interfaz creada previamente.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.IO;
namespace LogicaAlumnos
{
public class ServicioAlumnos : IServicioAlumnos
{
public XDocument GetDocumentoXmlAlumnos()
{
String ensamblado = «LogicaAlumnos.alumnos.xml»;
Stream datos = this.GetType().Assembly.GetManifestResourceStream(ensamblado);
XDocument docxml = XDocument.Load(datos);
return docxml;
}
public List<Alumno> GetAlumnos()
{
XDocument docxml = this.GetDocumentoXmlAlumnos();
var consulta = from datos in docxml.Descendants(«alumno»)
select new Alumno
{
IdAlumno = int.Parse(datos.Element(«idalumno»).Value),
Nombre = datos.Element(«nombre»).Value,
Apellidos = datos.Element(«apellidos»).Value,
Nota = int.Parse(datos.Element(«nota»).Value)
};
return consulta.ToList();
}
public Alumno BuscarAlumno(int idalumno)
{
return this.GetAlumnos().SingleOrDefault(z => z.IdAlumno == idalumno);
}
}
}
Una vez creada esta lógica creamos un nuevo proyecto WCF Service Application para comunicar dicha lógica con este proyecto que será el host. Yo lo he llamado HostAlumnos.
Una vez que esta creado vamos a eliminar unos archivos que trae por defecto que no hacen falta. El primero es IService1.cs y el archivo Service1.svc.cs que esta dentro de Service1.svc (este ultimo no se elimina porque es el vamos a utilizar). El archivo Service1.svc le he renombrado para saber cual es y lo he llamado Alumnos.svc.
Ahora le damos click derecho sobre References del proyecto Host y ahí le agregamos la referencia del proyecto Logica.
Cuando tenemos realizado lo anterior pasaremos a modificar el archivo web.config del proyecto Host y así poder exponer nuestro servicio de lógica.
<?xml version=»1.0″?>
<configuration>
<system.serviceModel>
<services>
<service name=»LogicaAlumnos.ServicioAlumnos» behaviorConfiguration=»enabledmetadata»>
<endpoint address=»» binding=»basicHttpBinding»
contract=»LogicaAlumnos.IServicioAlumnos»/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name=»enabledmetadata»>
<serviceMetadata httpGetEnabled=»true»/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.web>
<compilation debug=»true»/>
</system.web>
</configuration>
Y el ultimo paso de creación del servicio modificamos el archivo Alumnos.svc que creamos antes para exponer el nombre del servicio y aso poder utilizarlo en el MVC y poder consumir el servicio.
<%@ ServiceHost Language=»C#» Debug=»true»
Service=»LogicaAlumnos.ServicioAlumnos» %>
Ahora que ya lo tenemos hecho pones el conector SVC Alumnos.svc como pagina principal y el proyecto Host como proyecto principal y le damos a ejecutar para comprobar que funciona.
Cuando ya tenemos comprobado que funciona creamos un nuevo proyecto sobre la solución MVC Application para consumir el XML mediante el servicio WCF. Yo lo he llamado PruebaMVC.
Una vez creado le damos click derecho a References y agregamos una referencia de servicio. Y ahí pegamos el enlace obtenido de la comprobación previa (enlace LocalHost) y le damos a Discover y agregamos la referencia.
Ahora sobre la carpeta Controllers nos creamos un nuevo controlador para hacer la prueba. Yo lo he llamado AlumnosController. Y ahí creamos los dos ActionResult para las dos consultas que creamos.
using PruebaMVC.ServiceReference1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace PruebaMVC.Controllers
{
public class AlumnosController : Controller
{
ServicioAlumnosClient cliente;
public AlumnosController()
{
cliente = new ServicioAlumnosClient();
}
public ActionResult Index()
{
Alumno[] alumnos = cliente.GetAlumnos();
return View(alumnos);
}
public ActionResult Details(int idalumno)
{
Alumno alumno = cliente.BuscarAlumno(idalumno);
return View(alumno);
}
}
}
Una vez creado el crontroller creamos las dos vistas necesarias de Index y Details(puedes crearlas con Scafolding mismamente).
Index
@model PruebaMVC.ServiceReference1.Alumno[]
@{
ViewBag.Title = «Index»;
}
<table class=»table»>
<tr>
<th>NOMBRE</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@item.Nombre
</td>
<td>
@Html.ActionLink(«Detalles», «Details»
, new { idalumno = item.IdAlumno }) |
</td>
</tr>
}
</table>
Details
@model PruebaMVC.ServiceReference1.Alumno
@{
ViewBag.Title = «Details»;
}
<h2>Detalles de alumno</h2>
<div>
<h4>Alumno</h4>
<hr />
<dl class=»dl-horizontal»>
<dt>
@Html.DisplayNameFor(model => model.Nombre)
</dt>
<dd>
@Html.DisplayFor(model => model.Nombre)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Apellidos)
</dt>
<dd>
@Html.DisplayFor(model => model.Apellidos)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Nota)
</dt>
<dd>
@Html.DisplayFor(model => model.Nota)
</dd>
</dl>
</div>
<p>
@Html.ActionLink(«Volver al listado», «Index»)
</p>
Ponemos Index como pagina principal y ejecutamos para comprobar.
En el Index debería salirte algo así:
En Details debería salirte algo así:
Autor: Sergio Peña Lancha
Curso: Microsoft MCSA Web Applications + MCSD App Builder
Centro: Tajamar
Año académico: 2018-2019
Github: https://github.com/Sergto/ServicioWCFconXML
Linkedin: https://www.linkedin.com/in/sergio-pe%C3%B1a-lancha-38147b145/