El caso que voy a exponer hoy es como lograr la ejecución de procesos de larga duración desde aplicaciones web, las cuales no pueden quedar a la espera de la culminación de este proceso, sino solicitar la ejecución y seguir con la operación de la aplicación por parte del usuario.


                El escenario a utilizar es una aplicación web bajo MVC alojada en un Azure App Services que utiliza Entity Framework como enlace a una base de datos Azure SQL Server, y se requiere ejecutar un "stored procedure" o procedimiento almacenado de larga duración.

 

                Es importante resaltar que este caso aplicaría también para el escenario donde alojamos la aplicación web en un servidor web "on-premise" donde no podemos establecer un tiempo indefinido de espera para que termine un proceso de la aplicación, esto generaría que el proceso se interrumpa por un "time-out" ocasionando una posible inconsistencia debido a que el proceso no culminó de manera adecuada.  Para el caso de una aplicación web alojada en Azure App Services, no podemos establecer el tiempo de espera del servidor web, la recomendación del equipo de Azure es que manejemos otras alternativas para ejecutar procesos de larga duración.

 

                A continuación voy a mostrar el paso a paso del para la ejecución de un proceso asíncrono.

 

Paso 1: Accedemos a Microsoft Visual Studio​

Imagen1-1.jpg

Paso 2:  Se procede a crear un proyecto ASP.NET MVC 4 Web Application

Imagenes1A.jpg

Paso 3:  Selecciona el tipo de proyecto

Imagenes2A.jpg 

Paso 4:  Una vez creada la aplicación podemos ver la estructura de la misma

 Imagenes3A.jpg

Paso 5:  Se procede a crear el modelo Entity Framework del ejemplo, agregando un nuevo elemento a la carpeta Model.

 Imagenes4A.jpg

Paso 6:  Se selecciona ADO.NET Entity Data Model

 Imagenes55A.jpg

Paso 7:  Para este artículo tomaremos una base de datos ya existente para crear el modelo de Entity Framework

Imagenes6A.jpg

 

Paso 8:  Se selecciona la conexión a datos

Imagenes7A.jpg 

Paso 9:  Se selecciona la fuente "Microsoft SQL Server"

Imagenes8A.jpg

 

Paso 10:  Se ingresa los datos para conectarse a la base de datos: Servidor, usuario, contraseña y nombre de la base de datos.

 Imagenes10A.jpg

Paso 11: Una vez ingresado los parámetros para conectarse a la base de datos, se seleccionan las tablas, vistas, procedimientos almacenados que serán incluidos en la aplicación, en este caso podemos marcar el check box para los tres ítems como lo muestra la imagen.

 Imagenes15A.jpg

Paso 12:   Una vez culminado el proceso anterior, procedemos a crear un controlador de MVC para manejar el proceso que se desea ejecutar. Seleccionamos la carpeta "Controller" y con el click derecho del mouse seleccionamos Agregar è "Controller"

 Imagenes16A.jpg

Paso 13: Colocamos los datos del nuevo Controlador

 Imagenes17A.jpg

Paso 14:  Uva vez colocado los datos presione el botón "Add". Esto crea el nuevo controlador como se muestra en la imagen a continuación

 Imagenes18A.jpg

 

Paso 15:  Una vez creado el controlador, procedemos a crear el método que invocará el proceso masivo a través del comando "ExecuteSQLCommandAsync" en el contexto del objeto de Entity Framework que maneja la comunicación con la base de datos. A continuación está el ejemplo de la instrucción:

 Imagenes19A.jpg

En la variable "db" se asigna el valor de 36000, el cual representa segundos y permite extender el tiempo por defecto para la ejecución de cualquier proceso, instrucción, etc. con la base de datos.   En el contexto de esta variable se realizará el llamado del proceso almacenado en base de datos.

db.Database.CommandTimeout = 36000;

 

Luego de esto, se define una variable llamada "solicitudC", la cual controlará la ejecución de la instrucción "ExecuteSQLCommandAsync". Para el caso de este artículo se utilizaron dos parámetros para la ejecución de dicha instrucción:

  • TransactionalBehavior.DoNotEnsureTransaction: Si existe una transacción actual se utilizará en la ejecución de la instrucción, de otra forma se ejecutará sin una transacción. Para más información consulte este link.
  • "CalculoProceso": Nombre del procedimiento almacenado que se ejecutará.

 

 

En la imagen a continuación están los objetos de bases de datos que utilizaremos para desarrollar el caso de este artículo:

  • Procedimiento almacenado  "CalculoProceso": Es el procedimiento almacenado que será ejecutado.
  • Tabla  "ControProceso": Una tabla que se utiliza como elemento de control para saber si se está ejecutando el procedimiento almacenado "CalculoProceso", y así evitar que se ejecute varias veces al mismo tiempo. El procedimiento almacenado actualiza el valor del campo "Estado" de la tabla "ControlProceso" a "EN EJECUCION"  cuando comienza y lo vuelve a actualizar a "DISPONIBLE"  cuando termina. El procedimiento almacenado valida antes de comenzar su procesamiento si el valor del campo "ESTADO" está en "DISPONIBLE", sino es así no se ejecuta.
Imagenes20A.jpg

 

Paso 16:  El siguiente paso es crear una vista que permita ejecutar el proceso masivo. Para esto creamos simplemente dos "ActionResult" dentro del controlador creado anteriormente, uno para mostrar la vista y el otro que recibirá el "submit" de la vista al solicitar ejecutar el proceso.

Imagenes21A.jpg

 

Paso 17: Luego de esto se crea la vista haciendo click derecho sobre el nombre de uno de los "ActionResult", se selecciona "Add View" y se crea la vista.

Imagenes22A.jpg 

Paso 18:  A la vista recién creada, se le agregan las instrucciones que están en la imagen para poder lanzar la invocación del proceso en el controlador al seleccionar el botón de "Ejecutar".

Imagenes23A.jpg 

Paso 19: Una vez seguido todos los pasos anteriormente indicados, se procede a ejecutar la aplicación y se llega a la vista recién creada.

 Imagenes24A.jpg

                Como podemos ver la aplicación creada es muy sencilla, en la vista creada mostramos el valor "Estado", relacionada a la tabla "ControlProceso" mostrada en el paso 15.  Al marcar el botón "Ejecutar" se dispara el proceso a través del "Submit" del botón.

Imagenes25A.jpg

 

                Al generarse el "submit" se muestra el nuevo valor del estado del proceso, ya se lanzó el procedimiento almacenado y lo más importante, la aplicación no queda a la espera a la culminación del proceso permitiendo al usuario seguir avanzando. Si no manejáramos un proceso asíncrono la aplicación quedaría a la espera de la culminación del proceso y el usuario no podría seguir trabajando con la misma.

 

                Al culminar el proceso si volvemos a navegar a la vista de la aplicación vemos que el estado en "DISPONIBLE" nuevamente, y podríamos volver a ejecutar el proceso.

 

Imagenes24A.jpg 

 

 

Espero que este artículo les sea de utilidad, si quieren aprender más sobre desarrollo de aplicaciones,  desarrollo en SharePoint o de SharePoint en general por favor visita nuestro site de Eigo Academy para conocer nuestra oferta de cursos.