Barra de progreso para llamadas de servidor de larga ejecución en ASP.Net MVC

Solo quiero crear una barra de progreso mientras hago llamadas al servidor durante mucho tiempo. No pude crear una solicitud de publicación de ajax para el controlador mientras el controlador está haciendo un trabajo de larga ejecución.

Quiero crear una acción adicional para obtener la statement actual de la tarea actual de larga ejecución. Traté de crear una encuesta en una solicitud ajax y luego puedo devolver el estado desde el lado del servidor y mostrarlo en una barra de progreso del lado del cliente. Algunas ideas ?

La forma correcta y más fácil de hacer esto es con SignalR. Descargue Microsoft SignalR en https://www.nuget.org/packages/Microsoft.AspNet.SignalR/2.1.2

Cree una clase de concentrador en una carpeta separada en la ruta del proyecto llamada concentradores, agregue dos archivos de clase en la carpeta de concentradores

Startup.cs

using Owin; using Microsoft.Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up and configuration should go here app.MapSignalR(); } } } 

ProgressHub.cs

 using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web; using Microsoft.AspNet.SignalR; namespace RealTimeProgressBar { public class ProgressHub : Hub { public string msg = "Initializing and Preparing..."; public int count = 1; public static void SendMessage(string msg , int count) { var message = "Process completed for " + msg; var hubContext = GlobalHost.ConnectionManager.GetHubContext(); hubContext.Clients.All.sendMessage(string.Format(message), count); } public void GetCountAndMessage() { Clients.Caller.sendMessage(string.Format(msg), count); } } } 

En el controlador,

 // assemblies using Microsoft.AspNet.SignalR; using RealTimeProgressBar; //call this method inside your working action ProgressHub.SendMessage("initializing and preparing", 2); 

En vista,

        

Para más detalles, consulte algunos artículos existentes con la ayuda de google

Tuve un servicio de larga duración para eso, he dado una idea básica a continuación. Úselo según sus requisitos.

  1. Hice una estructura de los argumentos de progreso ProgressArgs
  2. En el servicio de larga ejecución LongRunningProcess (), se actualizaron los valores de progreso a intervalos regulares y se guardaron en formato JSON en la base de datos.
  3. Creó un método de acción getProgress() que devolverá un avance de cadena JSON mediante ajax.
  4. Se creó una función Javascript getProgress() función que una vez que se iniciará llamará al servidor a intervalos regulares para el progreso hasta que se complete el proceso.

He dado un ejemplo aproximado para implementarlo. Espero que te pueda ayudar.

La clase para estructura de argumentos de progreso

 public class ProgressArgs { public int Completed { get; set; } public int Total { get; set; } public int Percentage { get; set; } public string Status { get; set; } } 

En el Proceso, seguí actualizando las estadísticas en la base de datos

  public void LongRunningProcess() { ProgressArgs result = new ProgressArgs(); result.Completed = 0; result.Total = userList.Count; foreach (var item in itemList) { //Do Some processing which u want to do result.Total++; result.Percentage = (result.Completed * 100) / result.Total; result.Status = "Processing"; string strToSave = Newtonsoft.Json.JsonConvert.SerializeObject(result); //update the strToSave to the database somewhere. } //after completing of processing result.Total++; result.Percentage = (result.Completed * 100) / result.Total; result.Status = "Completed"; string strToSave = Newtonsoft.Json.JsonConvert.SerializeObject(result); //update the strToSave to the database somewhere. } 

La acción C # para obtener el progreso de ajax

  public string getProgress() { string strJSON = config.GetValue("progress"); //Get stats from the database which is saved in json return strJSON; } 

El código Javascript

 //Ajax Get Progress function function getProgress() { var dataToSend = ''; $.ajax({ url: '@Url.Action("getProgress")', //Link to the action method type: 'POST', contentType: 'application/json; charset=utf-8', data: dataToSend, success: function (response) { console.log(response); if (response != null) { data = JSON.parse(response); console.log(data); //update the progressbar progressbar.progressbar("value", data.Percentage); //When the jobalert status is completed clear the interval if (data.Status == 0) { setTimeout(getProgress, 800); //TImout function to call the respective function at that time } serviceCompleted(data); function to call after completing service } }, error: function (xhr) { alert('Error: There was some error while posting question. Please try again later.'); } }); }