【问题标题】:SignalR onDisconnected(bool stopCalled) getting called on File download in MVCSignalR onDisconnected(bool stopCalled) 在 MVC 中的文件下载时被调用
【发布时间】:2017-06-02 13:44:37
【问题描述】:

您好,在我的应用程序中,我使用 SignalR 来存储用户和 signalR 连接映射。我在 OnConnected() 事件上添加连接和用户映射,并在 OnDisconnected() 事件上删除连接。

从应用程序下载文件时会调用 OnDisconnected 事件,这会删除用户连接。下面是文件下载代码

 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 或 OnConnected 事件,这会导致数据丢失(存储在 OnConnectedEvent 上的用户连接映射)。因此系统无法向已删除的用户连接发送通知。

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

有谁知道为什么 onDisconnected 事件在 File download() 上被调用。

【问题讨论】:

    标签: asp.net-mvc signalr signalr-hub signalr-2


    【解决方案1】:

    最后我找到了解决问题的方法: 使用 signalR 客户端 API 在断开连接的事件上附加一个处理程序,并将超时设置为 2 或 3 秒,然后重新连接到集线器。如果下载大文件需要时间,这种方法也可以使用,因为只有在 SignalR HUB 断开连接时才会触发该事件,无论文件下载需要多少时间。

    下面是代码

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

    【讨论】:

      【解决方案2】:

      我们通过添加 target="_blank" 暂时“解决”了这个问题:

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

      但我们仍在寻找更好的解决方案,因此我们不需要使用 target="_blank"。 因此,非常感谢任何其他解决方案。

      【讨论】:

      • 嗨 cds,我已经发布了问题的解决方案,它运行良好,它是一次性集中配置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多