Индикатор выполнения для длительных вызовов сервера в ASP.Net MVC

Я просто хочу создать индикатор выполнения при длительных вызовах сервера. Я не мог создать запрос на отправку ajax controllerу, в то время как controller выполняет длительную работу.

Я хочу создать дополнительное действие, чтобы получить фактическое утверждение текущей долгосрочной задачи. Я попытался создать опрос в запросе ajax, после чего я смогу вернуть статус со стороны сервера и отобразить его на панели выполнения клиентской стороны. Есть идеи ?

Правильный и простой способ сделать это с помощью SignalR. Загрузите Microsoft SignalR в https://www.nuget.org/packages/Microsoft.AspNet.SignalR/2.1.2

Создайте class концентратора в отдельной папке в пути проекта, называемой хабами, добавьте два файла classа в папку концентраторов

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); } } } 

В controllerе,

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

Ввиду,

        

Для получения дополнительной информации см. Некоторые существующие статьи с помощью Google

Для этого у меня была долгая служба, я дал базовую идею ниже. Используйте его в соответствии с вашими требованиями.

  1. Я создал структуру аргументов ProgressArgs
  2. В долговременной службе LongRunningProcess () обновленные значения прогресса в регулярном интервале и сохраняются в формате JSON в базе данных
  3. Создал метод действия getProgress() который вернет ход строки JSON с помощью ajax.
  4. Созданная функция Функция Javascript getProgress() которая когда-то была запущена, будет вызывать сервер через регулярные промежутки времени для достижения прогресса, пока процесс не завершится.

Я привел пример для его реализации. Надеюсь, это может вам помочь.

Класс для структуры аргументов прогресса

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

В процессе я продолжал обновлять статистику в базе данных

  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. } 

Действие C # для достижения прогресса ajax

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

Код 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.'); } }); } 
Interesting Posts
Давайте будем гением компьютера.