SignalR onDisconnected(bool stopCalled)在MVC中调用文件下载

时间:2017-06-02 13:44:37

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

您好我的应用程序我使用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 事件。

2 个答案:

答案 0 :(得分:0)

我们暂时"解决了#34;这可以通过添加 target =" _blank"

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

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

答案 1 :(得分:0)

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

以下是代码

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