2017-06-02 2 views
0

Hallo in meiner Anwendung Ich benutze SignalR, um das Benutzer- und signalR Connection Mapping zu speichern. Ich bin Hinzufügen von Verbindungen und Benutzerzuordnung auf OnConnected() Ereignis und Entfernen von Verbindungen auf OnDisconnected() Ereignis.SignalR onDisconnected (bool stopCalled) wird angerufen Dateidownload in MVC

Das Ereignis OnDisconnected wird aufgerufen, wenn eine Datei von der Anwendung heruntergeladen wird, wodurch die Benutzerverbindungen entfernt werden. Unten ist der Code für die Datei herunterladen

public ActionResult DownloadFile(string fileName) 
    { 
     // adding time stamp to file name 
     fileName = fileName.FileNameWithTimeStamp(); 

     //Fetch file bytes from TempData 
     byte[] fileContent = (byte[])TempData[Constants.ExportedData]; 
     return File(fileContent, Constants.ExcelContentType, fileName); 
    } 

OnReconnected oder onConnected Ereignisse aufgerufen werden später nicht, was der Datenverlust (Benutzerverbindung Mapping auf OnConnectedEvent gespeichert) ergibt, ist. Daher kann das System keine Benachrichtigung an entfernte Benutzerverbindungen senden.

Unten finden Sie den Code für SignalR Ereignisse

public override Task OnDisconnected(bool stopCalled) 
    { 
     string name = Context.User.Identity.Name; 
     //Remove data to cache 
     cache.Remove(name.ToLower(),Context.ConnectionId); 

     return base.OnDisconnected(stopCalled); 
    } 


public override Task OnConnected() 
    { 
     string name = Context.User.Identity.Name.ToLower(); 
     if(!string.IsNullOrEmpty(name)) 
     {    
      cache.Add(name, Context.ConnectionId); 
     } 
     return base.OnConnected(); 
    } 

Hat jemand eine Ahnung, warum onDisconnected Ereignis wird auf Dateidownload genannt zu werden().

Antwort

0

Endlich fand ich die Lösung für das Problem: Fügen Sie einen Handler auf dem getrennten Ereignis mit der signalR-Client-API und Timeout für einige Sekunden 2 oder 3 und erneut mit dem Hub verbinden. Dieser Ansatz funktioniert auch, wenn eine große Datei Zeit zum Herunterladen benötigt, da das Ereignis nur dann ausgelöst wird, wenn der SignalR-HUB die Verbindung getrennt wird, unabhängig davon, wie lange der Download der Datei dauert.

Unterhalb der Code

connection.hub.disconnected(function() { 
     setTimeout(function() { 
      //Connect to hub again 
      $.connection.hub.start(); 
     }, 3000); 
    }); 
0

Wir "gelöst" vorübergehend diese target = "_ blank" durch Zusatz:

<a href="@Url.Action("DownloadFile", "Controller")" target="_blank"></a> 

Aber wir nach einer besseren Lösung suchen noch so brauchen wir nicht target = "_ blank" zu verwenden. Also jede andere Lösung wird sehr geschätzt.

+0

Hallo cds, ich habe die Lösung für das Problem gebucht haben und es funktioniert gut, es ist eine Zeit, die zentrale Konfiguration. –

Verwandte Themen