31 de diciembre de 2014

WCF Data Service y Entity framework

También conocido como ADO.NET Data Services, es un componente del .NET Framework que permite crear servicios web usando ODATA (Open Data Protocol), para exponer y consumir datos en la web mediante REST, ODATA expone los datos como recursos que son accesibles y modificados a través de URIs, usando los verbos HTTP GET(Consultar), PUT(Modificar), POST(Ingresar) y DELETE(Eliminar).

La idea principal de esta entrada es exponer una colección de entidades para ser consumidas y realizar queries sobre estas por los clientes, estas entidades serán disponibles a traves de un WCF Data Service que estara hospedado en IIS, ademas se utilizara Entity Framework para construir el modelo de entidades.

Empecemos, para este ejemplo se va crear un proyecto de tipo WCF Service Application al que llamare ServicioWCF, nuestro servicio ODATA sera hospedado en el IIS, es por esto que escogemos esta opción para este ejemplo


Despues de agregar el WCF Service Application, se procede a eliminar los siguientes files pues no los utilizaremos en este ejemplo


Ahora se agregara un nuevo item  al proyecto, este item sera del tipo WCF Data Service al que llamare OData.svc


al agregar el WCF Data Service se mostrara una plantilla en la que debe especificarse en 1 la fuente de datos que el servicio utilizara para entregar información y 2 las entidades que estarán disponibles para los clientes del servicio así como los permisos que tendrán sobre esas entidades, esta información la especificaremos luego de crear el modelo de la base de datos utilizando Entity Framework


Con el paso anterior el Solution explorer del proyecto queda asi:


De nuevo agregaremos un nuevo item al proyectp, este item sera del tipo ADO.NET Entity Data Model al cual llamare  ModeloEX.edmx


El modelo se creara a partir de una base de datos existente


Guardare la conexión a la base de datos en el web.config con el nombre conexion


Las tablas agregadas se muestran en el modelo, se agregaron las tablas Employee y Project


este es el Solution Explorer del proyecto con todos los items que le agregamos en los pasos anteriores


Ahora desde nuestro modelo, damos click derecho en un espacio en blanco y seleccionamos propiedades


En propiedades buscamos el valor del Entity Container Name, en este caso es conexion


y en el código del OData.svc especificamos valores tal como se muestra en la imagen, se debe especificar el contenedor, las entidades que deseamos exponer al cliente y los derechos que el cliente tendrá sobre esas entidades


La lista con todos los permisos que se pueden otorgar a sobre una entidad se le pueden otorgar a un cliente son


Como complemento al final del código podemos agregar config.UseVerboseErrors = true; esto para lograr obtener el detalle completo de la excepción desde el web services, en caso de que ocurra algún error.

Una vez se especifican el Entity Container, los nombres de las entidades y los accesos que el cliente tendra sobre ellas, cerramos la ventana anterior y desde el Solution Explorer nos posicionamos sobre OData.svc, damos cick derecho y seleccionamos View in Browser(Default Browser), el Default Browser en mi caso es Google Chrome por eso aparece especificado en la siguiente imagen


El explorador nos mostrara la siguiente información en XML


Si queremos ver la entidad Employees en el navegador en formato AtomPub debes escribir en el navegador  http://localhost/ServicioWCF/OData.svc/Employees tambien si quieres ver esta misma informacion pero en formato JSON debes escribir en el navegador web http://localhost/ServicioWCF/OData.svc/Employees()?$format=verbosejson

Ademas, si queremos mostrar datos en especifico de la entidad Employees como por ejemplo su nombre y dirección podriamos escribir esto en el navegador

http://localhost/ServicioWCF/OData.svc/Employees?$select=nombre,direccion

El siguiente paso es hospedar este servicio en IIS (pero recuerda que puedes hospedarlos es WAS, Self Hosting o bien en un Windows Service) para eso nos posicionamos en ServicioWCF desde el Solution Explorer y damos click derecho para seleccionar propiedades

  

Escogemos la opción Web en el panel izquierdo y seleccionamos Local IIS, luego damos click sobre el botón Create Virtual Directory y deberíamos obtener un mensaje como el que se muestra en la imagen


Para verificar que en verdad se creo el directorio en IIS, abrimos el administrador de IIS escribiendo inetmgr en el buscador de Windows y deberíamos obtener la siguiente imagen con el directorio SericioWCF dentro de los Default Web Site de IIS


de nuevo vamos al Solution Explorer nos posicionamos sobre OData.svc, damos click derecho y seleccionamos View in Browser(Default Browser) y obtenemos la siguiente imagen, donde nuestra dirección web especifica que el servicio esta debidamente hospedado en localhost, que en mi caso representa al IIS instalado en mi maquina, esta dirección la seleccionamos y la copiamos pues la utilizaremos para referenciar el servicio desde nuestra aplicación cliente.


Toca crear el cliente que consumirá el WCF Data Service, como lo tengo instalado en IIS puedo referenciar desde cualquier aplicación ya sea agregada a nuestro ServicioWCF o creando una nueva aplicación, en este ejemplo creare una nueva aplicación y para ello  el Visual Studio


Creare una aplicación de Windows Forms y la llamare ProbandoData


El paso mas importante sera agregar una referencia de servicio, para eso nos posicionamos en el Solution Explorer y sobre References damos click derecho y seleccionamos Add Service Reference


ahora pegamos la direccion web (que copiamos tres pasos arriba para comprobar que nuestro servicio estaba hospedado en IIS) en la especificación de Address y presionamos Go, deberíamos obtener nuestro servicio tal como muestro en la imagen...como distintivo para hacer referencia al servicio utilizare el nombre: OdataTest


El Solution Explorer de nuestro cliente quedaría de la siguiente manera con el WCF Data Service agregado como referencia y listo para ser consumido desde nuestro Windows Form


y el diseño del formulario que voy a utilizar solo tiene un DataGridView a fin de recuperar información desde el WCF Data Service y mostrar esa información en el DataGridView


El código para el evento Load del formulario es el siguiente, primero se debe especificar la Uri que es la dirección del WCF Data Service y luego utilizar esa Uri en el constructor de ODataTest.conexion donde ODataTest es la clase y conexion el nombre del modelo de base de datos.
private void Form1_Load(object sender, EventArgs e){

  // Conectando con el WCF Data Service
  Uri acceso = new Uri("http://localhost/ServicioWCF/OData.svc/", UriKind.Absolute);
  ODataTest.conexion proxy = new ODataTest.conexion(acceso);

    var query = from emp in proxy.Employees
               select emp;
    var datos = query.ToList();
    dataGridView1.DataSource = datos;

        }
Pero solo desplegando datos no llegaremos, si desde tu formulario cliente quieren hacer uso de las entidades del modelo construido podrían utilizar este código de guía, usaremos la entidad Employees que representa a la tabla Employees así que cualquier modificación, eliminación o ingreso de datos se reflejara en esta tabla sobre la base de datos, para este ejemplo se eliminaran datos especificos segun un EmpID de la tabla Employees
try{
  
  // Conectando con el WCF Data Service
  Uri acceso = new Uri("http://localhost/ServicioWCF/OData.svc/", UriKind.Absolute);
  ODataTest.conexion proxy = new ODataTest.conexion(acceso);
  
  // Utilizando la entidad Employees desde el WCF Data Server
  ODataTest.Employees eliminarCliente = (from c in proxy.Employees        
                                         where c.EmployeesID.Equals(EmpID)
                                         select c).Single();
  
  proxy.DeleteObject(eliminarCliente);
  serv.SaveChanges();
 }

catch (Exception ex){ Throw New ArgumentExcpetion(ex.message); }