Creando un WebApi con ASP .NET Core, Entity Framework Core, AutoMapper y publicación en IIS

Luis Beltran

Microsoft MVP | Xamarin Certified Mobile Developer | Estudiante en Universidad Tomás Bata en Zlín, República Checa | Docente en Instituto Tecnológico de Celaya, México | Soy fan de el Atlético de Madrid, el América, la selección de Italia, la música de Katie Melua y los videojuegos | Me gusta viajar

Podría también gustarte...

15 Respuestas

  1. Daniel dice:

    Sencillamente Excelente!!!

    • Luis Beltran dice:

      ¡Gracias por el comentario y espero te sea de utilidad! 😀

      • Daniel dice:

        Muy buenas de nuevo. Queria comentar que realice el paso a paso, pero con las ultimas versiones de los frameworks y salvo algun detalle minimo salio de una funcionando.
        Quisiera pedir si es posible para futuras sesiones, que puedas indicar una forma practica de como generar las api con versiones, o sea algo asi como/api/v1/values por ejemplo.
        Desde ya muchisimas gracias.

        • Luis Beltran dice:

          Muchas gracias por el seguimiento Daniel, igual si quieres en la siguiente sesión (o aquí) nos comentas cuáles fueron los cambios mínimos para mencionarlos y claro que sí, también puedo hacer mención sobre el soporte de versiones en los web apis. Una forma muy sencilla de hacerlo es a través de un paquete Nuget llamado “aspnet-api-versioning”. Una buena explicación de dicho paquete está aquí https://www.hanselman.com/blog/ASPNETCoreRESTfulWebAPIVersioningMadeEasy.aspx. El único detalle es que solo funciona del lado de los controladores, por lo que si entre versiones (v1, v2) un modelo cambia (agregar una nueva propiedad por ejemplo) una manera de resolver eso sería usando un nuevo DTO que solo se use en la v1.

          Pero está interesante, voy a ver si en la semana publico algo de eso o si no lo dejamos para la próxima sesión, gracias por la sugerencia, es algo que se ocupa mucho también 😀

          • Daniel dice:

            Hola. Como habia comentado estos son los cambios de los que comentaba. Realmente son Minimos.

            Primero que nada, la version de Visual Studio que estoy usando es la 15.8.5.

            Luego ASP.Net Core 2.1 es la plantilla para generar el proyecto.

            Los paquetes NUgets son:
            de Microsoft: EntityFrameworkCore 2.1.4 – EntityFrameworkCore.SqlServer 2.1.4 – EntityFrameworkCore.Design 2.1.4 – EntityFrameworkCore.Tools 2.1.4 – EntityFrameworkCore.SqlServer.Design 1.1.6
            de Jimmy Bogard: AutoMapper 7.0.1

            Luego, cuando se maquetan los objetos con Entity, el archivo DBContext, ya tiene el constructor y la cadena de conexion esta marcada con un warning.

            Por ultimo, el archivo application.json es minimo, y luego de agregar la cadena de conexion queda asi:
            {
            “ConnectionStrings”: { “StoreDBContext”: “Server=.\\SQLEXPRESS;Database=StoreDB;User Id=sa;Password=123” },
            “Logging”: { “LogLevel”: { “Default”: “Warning” } },
            “AllowedHosts”: “*”
            }

          • Luis Beltran dice:

            Te agradezco la información, voy a editar esta entrada agregando tus observaciones al final por si alguien quiere utilizar esa información en nuevas versiones

          • Daniel dice:

            No queria dejar de comentar que esto me sirvio para realizar un pequeño proyecto para una bolsa de profesores y estudiantes, que en un comienzo lo iba a realizar con otras tecnologias.

          • Luis Beltran dice:

            Si me parece que vi tu proyecto en GitHub, pues genial, que siga creciendo el proyecto con los conocimientos aprendidos ¡y gracias por darle seguimiento!

  2. Carlos Santana dice:

    Hola Luis, Muy gentil por la informacion y manuales que nos ayudas. Tengo una duda respecto al WebApi que lo creaste y talves tambien es por el tema de cantidad de datos máximos a pasar por este método?? Ya que quisiera crear un WebApi que me consuma de unas 15 tablas grandes cantidades de datos hacia un dispositivo móvil, en este caso cada tabla tiene como promedio 30 mil datos de 15 o mas columnas. Entonces me podrias ayudar con un consejo para poder realizar este paso de información por este WebApi? Te lo agradecería. Saludos. Carlos Santana

    • Luis Beltran dice:

      ¡Qué tal Carlos, gracias por tu visita! Al respecto de tu pregunta, fue uno de las dudas que surgieron cuando realicé el webcast en vivo. Mi opinión es que un servicio web nunca debería traerse toda esa cantidad de información en una sola llamada, lo ideal es manejar carga bajo demanda, es decir, que solamente se traiga la información que el cliente necesita en el instante. Por ejemplo, podrías obtener 30 registros y mostrarlos en una lista en el dispositivo móvil; si el usuario llega al fondo de la lista, consultar el servicio para mostrar los siguientes 30 datos. En pocas palabras, te estoy hablando de un mecanismo de paginación. Brevemente lo mencionamos durante la sesión y EF Core lo soporta. Incluso agregué un ejemplo en este post, en el controller CustomersController el método GetCustomer tiene una sobrecarga que toma de parámetro el número de página de datos a mostrar y la cantidad de registros a obtener (que se traduce a operaciones Skip y Take). Mi consideración es que un cliente realmente no necesita ver los 30 mil datos al instante y una estrategia para atacar ese problema es la paginación para carga bajo demanda.

      En la próxima sesión puedo hablar más de ello, de todas formas cuando realice la aplicación móvil en Xamarin te prometo que ahí también lo manejaremos 🙂

      Ahora, si lo que necesitas es cargar esa gran cantidad de información no para mostrarla inmediatamente sino en background en espera de ser utilizada, tal vez el approach recomendado sea trabajar con un almacenamiento local (SQLite) sincronizado con un almacenamiento remoto de manera que las operaciones sean locales al dispositivo en el mayor de los casos posible (en remoto harías la sincronización de información cuando haya algún insert, update o delete). Ese caso también lo vamos a analizar en una futura sesión.

      Espero haberme dado a entender jaja o si hay alguna duda al respecto me comentas.

      Saludos, Luis.

  3. Hola Luis, Muy gentil por la informacion y manuales que nos ayudas. Tengo una duda respecto al WebApi que lo creaste y talves tambien es por el tema de cantidad de datos máximos a pasar por este método?? Ya que quisiera crear un WebApi que me consuma de unas 15 tablas grandes cantidades de datos hacia un dispositivo móvil, en este caso cada tabla tiene como promedio 30 mil datos de 15 o mas columnas. Entonces me podrias ayudar con un consejo para poder realizar este paso de información por este WebApi? Te lo agradecería

  4. Carlos Santana dice:

    Hola Luis, Muy gentil por tu respuesta. Un poco acoplando mi proyecto es que nosotros trabajamos con una aplicación en batch que tiene toda esa información en el móvil desde una base de datos SQL que guardamos en SQLite. Pero esa información solo se la pasa una vez al inicio para despues solo realizar los update, delete o insert de registros que cumplan estas condiciones.
    El problema lo mitigamos de alguna manera en ocasiones con una paginación manual en la invocacion del WebApi pero tenemos problemas al momento que mas de 10 personas al mismo tiempo realizan esta descarga.
    Espero la próxima sesión para saber que se podria hacer.

    Saludos.
    Carlos

    • Luis Beltran dice:

      Comprendo, entonces si es el segundo caso que mencionaba, el de cargar información en background para después manipularla con inserts, updates o deletes. En ese caso hay varias consideraciones, una es reindexar para que las consultas sean más rápidas, o revisar las queries que se realizan por si alguna tiene un bajo desempeño. Hay otra alternativa que puede ser compleja pero útil: la partición de tablas. La cuestión es que para combinarlo con servicios REST no sé cómo se haga de manera efectiva (una opción sería similar a como se maneja la paginación, de manera que con un parámetro sabes qué partición consultar). La idea es que en vez de hacer joins de 30000 (tabla 1) por 200 (tabla 2) haces pequeños joins que se pueden procesar en paralelo o más rápidamente. En pocas palabras, requiere un buen análisis. Igual si se me ocurre algo te comento.

      Saludos.

  5. Carlos Santana dice:

    Hola Luis nuevamente Carlos te saluda, Para adelantarme un poco a ese tema te contaré que: Lo que se hace desde el dispositivo móvil es copiar de unas tablas intermedias que manejan estados, códigos de usuarios y esas las pegamos directamente a las tablas con SQLite. Entonces al menos en demoras de consultas las mermamos y el problema real es que al actualizar los estados cuando son varios usuarios comienza a existir problemas como son los tiempos de escritura-lectura. Es decir que nosotros tenemos 15 tablas con 15 columnas cada una que se pasan las 15 tablas con 15 columnas al dispositivo. y en al menos 6 tablas tenemos 30 000 registros en cada una y en las demas en promedio 1500. Con todo le seguimos poniendo cabeza en los tratamientos para paso de información al dispositivo móvil.
    Saludos

  6. Cristhian Camilo Delgado dice:

    Muy buen tutorial te felicito y agradezco

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Follow on Feedly