【问题标题】:Cannot navigate through the site if a file is being downloaded如果正在下载文件,则无法浏览该站点
【发布时间】:2019-12-17 05:17:46
【问题描述】:

我正在尝试使用Context.Response.OutputStream.Write 方法从服务器分块下载一个大文件(存储在数据库中)。但是在下载完成之前,我无法浏览该站点,换句话说,直到响应结束。页面上有一个链接,它只是重定向到通用处理程序(*.ashx 文件类型)。 不适合使用Context.Response.OutputStream.TransmiteFile。在另一个线程中下载也不能解决问题。

HttpResponse response = Context.Response;
Int32 chunkSize = AppSettings.DownloadChunkSizeMb * 1024 * 1024;
Int32 filePosition = 0;

// Here some code to fill response headers...

while (filePosition < Metadata.Size) // Metadata is retrieved from the database
{
    Byte[] chunk = // Retrieving file chunk from the database...

    if (!response.IsClientConnected)
    {
        break;
    }
    response.OutputStream.Write(chunk, 0, chunk.Length);
    response.Flush();

    filePosition += chunk.Length;
}

【问题讨论】:

  • 多线程吧!只需在另一个线程上进行下载,这应该可以解决您的问题。
  • @theWongfonSemicolon,感谢您的评论,但我已尝试异步执行此操作,页面仍在等待响应。
  • 或者在某些解决方案中重定向到一个白页并且没有任何反应。
  • 客户端正在等待响应结束,那么如果我们在服务器端运行一个新线程有什么区别呢?没有区别,因为客户端仍然会等待响应结束,但现在来自另一个线程。

标签: c# asp.net httpresponse outputstream


【解决方案1】:

这是一个棘手的问题。如果我得到他的权利,请告诉我 我首先想到的是异步 ajax 调用。异步 ajax 调用不会阻塞浏览器,操作将在服务器端执行。

如果您需要浏览页面,则需要将此 ajax 放在不同的窗口或不同的选项卡中(我已经在不同的窗口中完成了此操作。) 您可以打开一个新窗口,进行异步 ajax 调用,然后在服务器端的响应到达时关闭该窗口。 希望这会有所帮助。

【讨论】:

  • 谢谢你的回答,我会尽量做到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2021-10-20
  • 2019-08-24
  • 2016-12-22
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多