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