MVC5 C# SignalR обновление клиента только в конце моей долгой работы - PullRequest
2 голосов
/ 27 февраля 2020

Я пытаюсь использовать SignalR для обновления модального режима в моем клиенте, пока на сервере создается папка zip, я следовал этому руководству: https://www.codeproject.com/Articles/1124691/SignalR-Progress-Bar-Simple-Example-Sending-Live-D

Это работает только иногда, но я не могу объяснить, почему у меня такое странное поведение: когда он не работает, модал обновляется только после того, как мой почтовый индекс отправляется клиенту, прогрессия go прямо до конца. В режиме отладки я вижу вызов моей функции во время моего l oop на стороне сервера, но мой клиент не знает об этих вызовах, кроме как в конце моей функции.

Есть журналы, когда это не так рабочая:

SignalR.Transports.TransportHeartBeat Информация: 0: Соединение 0ae92ae c -a196-40df-b857-4c97fed7932d является Новым. SignalR.Transports.WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 0ae92ae c -a196-40df-b857-4c97fed7932d, транспорт: WebSocketTransport, сообщение: {"C": "d-7952E959-B, 0 | C, 0 | D, 1", " S ": 1," M ": []} SignalR.Transports.TransportHeartBeat Verbose: 0: KeepAlive (0ae92ae c -a196-40df-b857-4c97fed7932d) SignalR.Transports.WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 0ae92ae c -a196-40df-b857-4c97fed7932d, транспорт: WebSocketTransport, сообщение: {"C": "d-7952E959-B, 0 | C, 4 | D, 1", " M ": [{" H ":" ProgressHub "," M ":" AddProgress "," A ": [" Подготовка к отправке, merci de Patienter ... "," 1/4 "]}, {" H ":" ProgressHub "," M ":" AddProgress "," A ": [" Подготовка к работе, подробное описание ... "," 2/4 "]}, {" H ":" ProgressHub "," M ":" AddProgress "," A ": [" Подготовка к работе, подробное описание ... "," 3/4 "]}, {" H ":" ProgressHub "," M ":" AddProgress ", «A»: [«Подготовка к обучению, merci de Patienter ...», «4/4»]}]}

Как видите, все ходы отправляются в одном websockettransport

Где, когда все в порядке, у меня есть эти:

SignalR.Transports.TransportHeartBeat Информация: 0: Соединение 4ba31f7b-1b2d-481f-8692-74e2bdddb79 c является Новым. SignalR.Transports.WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 4ba31f7b-1b2d-481f-8692-74e2bdddb79 c, транспорт: WebSocketTransport, сообщение: {"C": "d-D358E1ED-B, 0 | E, 0 | F, 1", "S" : 1, "M": []} SignalR.Transports.WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 4ba31f7b-1b2d-481f-8692-74e2bdddb79 c, транспорт: WebSocketTransport, сообщение: {"C": "d-D358E1ED-B, 0 | E, 1 | F, 1", "M" : [{"H": "ProgressHub", "M": "addprogress", "A": ["Подготовка к отправке, merci de Patienter ...", "1/50"]}]} SignalR.Transports. WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 4ba31f7b-1b2d-481f-8692-74e2bdddb79 c, транспорт: WebSocketTransport, сообщение: {"C": "d-D358E1ED-B, 0 | E, 2 | F, 1", "M" : [{"H": "ProgressHub", "M": "addprogress", "A": ["Подготовка к отправке, merci de Patienter ...", "2/50"]}]} SignalR.Transports. WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 4ba31f7b-1b2d-481f-8692-74e2bdddb79 c, транспорт: WebSocketTransport, сообщение: {"C": "d-D358E1ED-B, 0 | E, 3 | F, 1", "M" : [{"H": "ProgressHub", "M": "addprogress", "A": ["Подготовка к отправке, merci de Patienter ...", "3/50"]}]} SignalR.Transports. WebSocketTransport Verbose: 0: отправка исходящего сообщения. Идентификатор соединения: 4ba31f7b-1b2d-481f-8692-74e2bdddb79 c, транспорт: WebSocketTransport, сообщение: {"C": "d-D358E1ED-B, 0 | E, 4 | F, 1", "M" : [{"H": "ProgressHub", "M": "addprogress", "A": ["Подготовка к работе, merci de Patienter ...", "4/50"]}]}

.......

Отправляется один WebSocketTransport для каждого шага хода выполнения.

Мой код:

  $(function () {
        var progress = $.connection.progressHub;
        progress.client.addprogress = function (message, percentage) {
            values = percentage.split('/');
            left = values[0];
            right = values[1];
            if (left == right) {
                ProgressBarModal("show", message + " " + percentage);
            }else {
                ProgressBarModal("show", message + " " + percentage);
            }             
            $('#ProgressMessage').width(percentage + '%');
        };

        $.connection.hub.start().done(function () {
            console.log("start hub");          
            var connectionId = $.connection.hub.id;   
            console.log("ConnectionID=" + connectionId);
        });
    });
public class ProgressHub : Hub
{
     public static void SendProgress(string connectionId, string progressMessage, int progressCount, int totalItems)
     {
            var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>();
            hubContext.Clients.Client(connectionId).AddProgress(progressMessage, progressCount + "/" + totalItems);
     }
}
[assembly: OwinStartup(typeof(prodipmvc.Startup1))]
namespace prodipmvc
{
    public class Startup1
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

MyController:

[HttpPost]  
public ActionResult TelechargerPDF(string connectionId, List<string> selectedItems, string filigrane)
{
        string sysFile = "";
        //Contrôle paramètre obligatoire
        if (selectedItems == null || selectedItems.Count <= 0)
        {
            Response.StatusCode = 599;
            Response.StatusDescription = Resources.Erreurs.Archive_Telecharger_Non_Selectionner;
            return Json(new { success = false, responseText = Resources.Erreurs.Archive_Telecharger_Non_Selectionner });
        }
        ProdipRoot ProdipR = (ProdipRoot)Session["ProdipRoot"];     
        try
        {
            //Initialisations
            List<string> listeSysFilesPourLog = new List<string>(); //liste des sysfiles decrypté pour logger le telechargement
            MemoryStream output = new MemoryStream();               //
            int numero_ligne = 0;
            selectedItems = selectedItems.Distinct().ToList();
            string handle = Guid.NewGuid().ToString();
            List<string> decryptedSysFiles = new List<string>();
            List<string> PathOfFiles = new List<string>();

            var hubContext = GlobalHost.ConnectionManager.GetHubContext<Models.ProgressHubs.Util.ProgressHub>();

            foreach (string file in selectedItems)
            {
                numero_ligne++;                    
                Models.ProgressHubs.Util.ProgressHub.SendProgress(connectionId, "Préparation en cours, merci de patienter...", numero_ligne, selectedItems.Count);
                decryptedSysFiles.Add(sysFile);
                PrArchive archiveParent = ProdipR.Archives.ArchivesList.Find(x => x.DbId == ProdipR.ProDip.archive_dbID);                                                
                PrDocument doc = new PrDocument(ProdipR, archiveParent, sysFile);   
                string cheminFichier = doc.GenerateNewFileName();
                if(!string.IsNullOrEmpty(cheminFichier))
                    PathOfFiles.Add(cheminFichier); //on remplie la liste des chemins à Zipper
            }

            string cheminDossierSession = HttpContext.Server.MapPath("~/workspace/" + ProdipR.SessionUUID + "/") + DateTime.Now.ToString("dd-MM-yyyy_HH-mm-ss") + ".zip";
            using (ZipFile zip = new ZipFile())
            {
                zip.AlternateEncodingUsage = ZipOption.AsNecessary;
                zip.AddFiles(PathOfFiles, ""); //On zip la liste entière!
                zip.ParallelDeflateThreshold = -1;
                zip.Save(cheminDossierSession);
                ProdipR.Histo.TelechargerPDF(ProdipR.CurrentUserUUID, handle, ProdipR.ProDip.archive_dbID, ProdipR.Archives.ArchivesList.Find(x => x.DbId == ProdipR.ProDip.archive_dbID).DbName, decryptedSysFiles);
            }

            TempData[handle] = cheminDossierSession;
            return Json(new { success = true, fileGuid = handle });
        }
        catch(Exception ex)
        {
            //ERREUR : Historisation & Redirection
            ProdipR.Histo.ErreurApplicativeImportante(ProdipR.CurrentUserUUID, ex.Message + " - " + ex.StackTrace, "Archive", "TelechargerPDF", "", sysFile, "");

            Response.StatusCode = 599;
            Response.StatusDescription = ex.Message;
            return Json(new { success = false, responseText = ex.Message });
        }
    }
}

Моя функция TelechargerPDF - это ajax вызов:

    $.ajax({
                    url: '@Url.Action("TelechargerPDF", "Archive")',
                    type: 'POST',
                    data: { "connectionId": $.connection.hub.id, selectedItems: selectedFile, filigrane: MentionAppliquee },
                    dataType: 'json',
                    beforeSend: function () {
                        $("#overlay").show();
                    },
                    success: function (response) {
                        //On attend une sec car des fois le success est executé avant les derniers showprogress de la progressbar                        
                            ProgressBarModal("hide", "");
                            $("#overlay").hide();
                            window.location = "@Url.Action("DownloadPDF", "Archive")?fileGuid=" + response.fileGuid+"&fileName=@System.Web.HttpUtility.UrlEncode(Model.DbNamealias.Replace(" ","_").Replace("&","_"))";                      
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        ProgressBarModal("hide", "");
                        if (jqXHR.status == 599) {
                            ShowErreurMessageClient(jqXHR.statusText);
                        }
                        else {
                            ShowErreurMessageClient("@Html.Raw(prodipmvc.Resources.Erreurs.Erreur_Innatendu)");
                        }                     
                    },
                    complete: function (resultat, statut) {                       
                        $("#overlay").hide();
                            }
                        });

Я ничего не вижу в инспекторе, когда он не работает. Я не вижу никакого разъединения концентратора во время прогрессии. Если у вас есть предложения? Спасибо за вашу помощь и время.

...