2017-06-02 2 views
0

Salut dans mon application J'utilise SignalR pour stocker l'utilisateur et mappage de connexion signalR. J'ajoute des connexions et mappage utilisateur sur événement OnConnected() et la suppression des connexions sur OnDisconnected() événement.SignalR onDisconnected (bool stopCalled) est appelé Téléchargement de fichier dans MVC

L'événement OnDisconnected est appelé lorsqu'un fichier est téléchargé depuis l'application, ce qui supprime les connexions de l'utilisateur. Voici le code pour le fichier télécharger

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 ou événements onConnected ne sont pas appelés se suite, ce qui entraîne la perte de données (cartographie de connexion utilisateur stockées sur OnConnectedEvent). Le système ne peut donc pas envoyer de notification à une connexion utilisateur supprimée.

est Ci-dessous le code pour les événements SignalR

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

Est-ce que quelqu'un a une idée pourquoi OnDisconnected événement est s'appelé téléchargement du fichier().

Répondre

0

Enfin, j'ai trouvé la solution au problème: Attacher un gestionnaire sur l'événement déconnecté avec l'API client signalR et régler le délai d'attente de quelques secondes 2 ou 3 et reconnecter avec le concentrateur. Cette approche fonctionnera également si un fichier volumineux prend du temps à télécharger car l'événement ne se déclenchera que si le HUB SignalR se déconnecte, quel que soit le temps de téléchargement du fichier.

Voici le code

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

Nous temporairement "résolu" en ajoutant target = "_ blank":

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

Mais nous sommes toujours à la recherche d'une meilleure solution pour que nous ne devons pas utiliser target = "_ blank". Donc, toute autre solution est très appréciée.

+0

cds Salut, j'ai posté la solution au problème et il est fonctionne très bien, il est une fois la configuration centralisée. –