Я пытаюсь использовать 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();
}
});
Я ничего не вижу в инспекторе, когда он не работает. Я не вижу никакого разъединения концентратора во время прогрессии. Если у вас есть предложения? Спасибо за вашу помощь и время.