Creando un WebApi con ASP .NET Core, Entity Framework Core, AutoMapper y publicación en IIS
¡Hola! Cuando desarrollamos una aplicación móvil hay ocasiones que también necesitamos crear el backend que acceda a la base de datos. En esta entrada aprenderás a crear un WebApi usando ASP .NET Core y Entity Framework Core como tecnología de acceso a los datos de nuestro almacenamiento. La base de datos está en SQL Server. Además, utilizaremos AutoMapper para construir DTOs a partir de los modelos generados por EF Core. Finalmente, publicaremos en IIS el Web Api construido con el fin de acceder a él posteriormente por una aplicación cliente (móvil, construida en Xamarin, pero eso será en otra publicación).
Nota #1: El código fuente de esta entrada está disponible en GitHub, solo haz clic aquí.
Nota #2: Esta publicación es la guía paso a paso de la sesión en vivo que tuvimos en mi canal de YouTube el sábado 6 de Octubre. La sesión fue grabada y puedes revisarla aquí.
¡Manos a la obra!
La base de datos con la que vamos a trabajar tiene la siguiente estructura.
Paso 1. Conéctate a SQL Server Management Studio y ejecuta el siguiente script para crear la base de datos.
Paso 2. Abre Visual Studio y crea un proyecto de tipo Aplicación web ASP .NET Core (dentro de la categoría .NET Core en el Visual C#)
Paso 3. Selecciona API en el tipo de plantilla (la versión que usaremos es ASP .NET Core 2.0)
Paso 4. Una vez creado el proyecto, da botón derecho sobre el nombre del proyecto y selecciona Administrar paquetes Nuget. Vamos a agregar paquetes requeridos para manejar Entity Framework Core con SQL Server en nuestro backend.
Paso 5. El primer paquete que agregaremos es Microsoft.Entity.FrameworkCore.SqlServer. Importante: usaremos la versión 2.0.2:
Paso 6. El siguiente paquete es Microsoft.EntityFrameworkCore.Tools (también versión 2.0.2)
Paso 7. Siguiente paquete: Microsoft.EntityFrameworkCore.Design versión 2.0.2:
Paso 8. Ahora instalamos Microsoft.EntityFrameworkCore.SqlServer.Design, la última versión disponible.
Paso 9. Finalmente, instalamos AutoMapper.
Paso 10. El siguiente paso es hacer el scaffolding (generación de código) a partir de la base de datos. El resultado serán clases que modelan las tablas incluidas en el almacenamiento. Accede al menú Herramientas > Administrador de paquetes Nuget > Consola del Administrador de paquetes:
Paso 11. A continuación, escribe el siguiente comando en la consola:
Scaffold-DbContext “Server=TuServidor;Database=StoreDB;User ID=TuUsuario;Password=TuContraseña” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
Como puedes ver, las clases fueron creadas en la carpeta Models. Cada clase tiene como propiedades los atributos de las tablas correspondientes.
Paso 12. Otra de las clases creadas es una clase de contexto, StoreDBContext, la cual contiene la cadena de conexión al servidor. Sin embargo, éste no es el lugar indicado para dicha cadena, por lo que vamos a sacarla de ahí y utilizar Dependency Injection. El primer paso es eliminar el código del método OnConfiguring…
Paso 13. …y reemplazarlo por el siguiente código:
(básicamente es el constructor de la clase llamando al constructor de la clase base pero pasando como parámetro DbContextOptions)
Paso 14. Ahora agrega una cadena de conexión en el archivo appsettings.json:
“ConnectionStrings”: {
“StoreDBContext”: “Server=TuServidor;Database=StoreDB;User ID=TuUsuario;Password=TuContraseña”
},
Paso 15. Agrega una nueva carpeta llamada DTOs.
Paso 16. En dicha carpeta, agrega una clase.
El nombre de la clase es CustomerDTO (representando el modelo Customer)
Paso 17. Repite el paso anterior para tener los DTOs (Data Transfer Objects) del resto de los modelos generados previamente.
Paso 18. Cada DTO tendrá la misma estructura (propiedades) que el modelo que representa. Sin embargo, los elementos ICollection se convierten en List y si una clase utiliza objetos de otro modelo, se reemplaza por su respectivo DTO. A continuación tienes el código de cada DTO:
CustomerDTO.cs: (CustomerOrder era un objeto ICollection<CustomerOrder> pero ahora se convierte en List<CustomerOrderDTO))
CustomerOrderDTO.cs:
EmployeeDTO.cs:
OrderDetailDTO.cs:
OrderStatusDTO.cs:
ProductDTO.cs:
Paso 19. A continuación crea la clase AutoMapperConfiguration (la cual mapeará los modelos a los DTOs; además vamos a ignorar las propiedades de navegación a fin de que los JSON generados por los controladores no tengan referencias circulares) en la misma carpeta DTOs con el siguiente código:
Paso 20. Modifica la clase Startup.cs para incluir la configuración de AutoMapper, la eliminación de referencias circulares por parte de la serialización Json y la inyección de dependencias que mencionamos para el contexto.
La clase Startup queda con el siguiente código:
Paso 21: Ahora vamos a agregar los controladores, que son los métodos expuestos por el Web Api para realizar operaciones CRUD sobre las tablas de la base de datos. Sobre la carpeta Controllers, botón derecho y selecciona Agregar > Controlador
Paso 22: Selecciona Controlador de API con acciones que usan Entity Framework.
Paso 23: En clase de modelo selecciona Customer (de la carpeta Models), luego en clase de contexto elige StoreDBContext. El nombre del controlador será CustomersController.
Paso 24: Repite este proceso para generar los controladores del resto de los modelos:
Como puedes ver, cada controlador contiene métodos para acceder a la información (Get), insertar datos (Post), modificar un registro (Put) y eliminar un elemento (Delete). Vamos a modificar cada controlador para que funcione con los DTOs, así como agregar y modificar algunos métodos. A continuación se muestra el código final de cada controlador:
CustomerOrdersController.cs:
CustomersController.cs:
EmployeesController.cs:
OrderDetailsController.cs:
OrderStatusesController.cs:
ProductsController.cs:
Paso 25: En el explorador de soluciones selecciona el archivo appsettings.json y en su propiedad Copiar en el directorio de salida elige Copiar siempre.
Paso 26: A continuación vamos a probar el web api construido hasta el momento. Da clic en el botón IIS Express para compilar y desplegar la aplicación
Paso 27: Cuando el navegador sea ejecutado, abre Postman y hagamos una prueba del método Login (que pertenece al controlador Customers)
- Selecciona POST
- Revisa el puerto asignado cuando se lanzó la página web para conocer el puerto de tu aplicación (también lo puedes revisar en las propiedades del proyecto).
- Coloca la url http://localhost:puerto/api/customers/Login
- Elige Body
- El tipo raw
- El formato JSON (application/json)
Cuando das clic en el botón Send, observa que la consulta se realiza correctamente (200 OK) y el registro específico es devuelto
Paso 28. Otra prueba. Una consulta de los status de las órdenes con el método GET y el controlador OrderStatuses:
Paso 29. Detén la aplicación. Ahora vamos a proceder a publicar el proyecto en IIS. Para ello hay que realizar algunos ajustes. En primer lugar modifica el archivo Program.cs agregando código en el método BuildWebHost:
Paso 30. Ahora accede a las propiedades del proyecto (doble clic)
Paso 31. En la categoría Depurar modifica el valor de la variable de entorno ASPNETCORE_ENVIRONMENT a production (todo en minúsculas)
Paso 32. Ahora accede a la dirección https://www.microsoft.com/net/download/dotnet-core/2.0 y descarga el Runtime & Hosting Bundle (en este caso estamos descargando la versión 2.0.9 del Runtime)
Paso 33. Instálalo y después reinicia tu equipo.
Paso 34. Ahora procedemos a publicar el Web Api. Da clic derecho sobre el proyecto y elige la opción Publicar.
Paso 35. Selecciona el destino IIS, FTP, etc. y elige Publicar nuevamente.
Paso 36. Elige Sistema de archivos como método de publicación y selecciona una ruta de destino de publicación. Luego clic en Siguiente.
Paso 37. Expande la opción Base de datos y checa la opción Usar esta cadena de conexión en tiempo de ejecución. Da clic en Guardar.
Paso 38. En ocasiones cuando aparece esta pantalla la opción de usar la cadena de conexión no se guarda, por lo que puedes regresar dando clic en el botón Configuración y volverla a marcar. Una vez que asegures que la cadena de conexión está guardada da clic en el botón Publicar.
Paso 39. Al recibir el mensaje de que la aplicación web se publicó con éxito, accede a la ruta de destino seleccionada y observa que en efecto los archivos del proyecto se encuentran ahí. Ahora abre una ventana del Símbolo de sistema (cmd) y ejecuta el siguiente comando
dotnet “Ruta\StoreWebApi.dll”
Si la ejecución es correcta, verás que el proyecto está en ejecución en un puerto específico (5000):
Paso 40: Finalmente, accede desde Postman y verifica el correcto funcionamiento, por ejemplo puedes agregar un nuevo producto.
¡Y eso es todo de momento! En la siguiente entrega vamos a meterle seguridad (tokens), hacer accesible el proyecto desde un cliente (por ejemplo una app móvil) y más cosas.
¿Qué tal te pareció esta práctica? Si tienes alguna duda con la implementación de este proyecto, déjame un comentario para ayudarte 🙂
Recuerda que también puedes apoyarte de la sesión en vivo que realizamos en YouTube:
Espero que esta publicación haya sido de utilidad para tí. No olvides compartirla con tus amigos si fue interesante o si crees que puede servirles.
Sin más por el momento, me despido. ¡Nos vemos en la próxima entrega!
¡Gracias por tu visita!
Luis