发出第二个HTTP请求(在第一个结束之前)关闭与第一个

时间:2016-10-17 19:47:43

标签: c# asp.net http iis-7

我有一个网站,允许用户通过点击href链接来下载文件,这些链接将调用HTTP GET请求并返回文件(将在IE中提示用户并在Chrome中自动下载)

        public async Task<IActionResult> DownloadFile(DocumentFile file){
            fileName = DocumentTask.RetrieveFiles(new string[1] { file.FileID }, file.Facility, UserData.Access).SingleOrDefault();
            if (System.IO.File.Exists(fileName))
            {
                FileInfo info = new FileInfo(fileName);
                return File(System.IO.File.ReadAllBytes(fileName), FileUtility.GetContentType(fileName), info.Name);
            }
        }

当用户点击下载链接时:

<a href="/File/DownloadFile?FileUID=1111&amp;Facility=TestFacility&amp;Name=TestFile.pdf"><i class="file pdf outline icon"></i>TestFile.pdf</a>

而不是在点击另一个下载链接之后(在第一个下载链接返回响应之前),它会显示客户端关闭与第一个请求的连接。它会给出这个错误:

远程主机关闭了连接。错误代码为0x800703E3。

当服务器尝试将文件返回给用户时会抛出此错误,但由于连接已关闭,因此无法解决此问题。

使用Chrome开发者工具,我可以看到两个请求都排队,但是一旦发送第二个请求,它就会取消第一个请求(关闭连接)。

Chrome Developer Request Cancelled

现在我已经禁止用户点击另一个下载链接,直到上一个请求返回,但我想知道是否有更优雅的解决方案允许发送和等待多个请求?

(我已经在Chrome和IE 11中对此进行了测试,并且都取消了之前发送的请求)

提前致谢。

2 个答案:

答案 0 :(得分:0)

也许你可以使用下一个功能的功能来达到你的目标,我已经测试了它并没有停止接收文件,让我知道这是否适合你:

public Stream Downloadfile(string filename)
        {
            WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = "attachment; filename=" + filename;
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/octet-stream";
            return File.OpenRead(filename);
        }

答案 1 :(得分:0)

我无法找到解决方案的答案。但是我能够改变链接的工作方式。通过更改链接target =“_ blank”,它将打开一个新页面并在文件开始下载时关闭。这会阻止用户选择第二个链接,直到另一个链接返回,但如果他们使用鼠标中键打开链接但不更改选项卡焦点,则会停止发生错误。我认为来自同一标签的多个请求是问题。