无法从 HTTP 处理程序中的响应下载文件

Failure to download file from an Response in a HTTP handler

我正在尝试通过 HTTPHandler 中的 HTTP 响应下载具有自定义格式的纯文本文件。该文件由数字、字母和“|”组成作为分隔符。该文件是在运行时生成的,不会被保存。

该句柄还用于 return 数据到 JavaScript 函数,因此在下载文件时无法关闭响应。

目前这是用于下载文件的代码。

MemoryStream ms = new MemoryStream();
TextWriter tw = new StreamWriter(ms);
tw.Write(file1);
byte[] bytes = ms.ToArray();
ms.Close();

context.Response.Clear();
context.Response.ContentType = "text/plain";
context.Response.AddHeader("content-disposition", "attachment;    filename=file.15");
context.Response.AppendHeader("Content-Length", bytes.Length.ToString());
context.Response.BinaryWrite(bytes);

context.Response.Flush();
context.Response.Close();

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = query["File1"], File2 = query["File2"] }));

然而,当执行此代码时,没有错误(服务器端和客户端)并且文件未下载。

使用处理程序执行这两个操作似乎是不可能的(如 Patrick Hofman 的评论中所述),因为为了使用响应下载文件,必须关闭响应。

作为解决方案,处理程序可以在响应中写入文件的字节流(或字符串),然后通过 JavaScript 继续下载它们。

在处理程序中使用以下代码:

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = File1, File2 = File2 }));

为了return数据然后在JavaScript中使用这段代码:

function Download(response) {           
        DownloadFile("File1.15", response.File1);
        DownloadFile("File2.15", response.File2);         
    }
function DownloadFile(filename, data) {
        var blob = new Blob([data], { type: 'text/plain' });
        if (window.navigator.msSaveOrOpenBlob) {
            window.navigator.msSaveBlob(blob, filename);
        }
        else {
            var elem = window.document.createElement('a');
            elem.href = window.URL.createObjectURL(blob);
            elem.download = filename;
            document.body.appendChild(elem);
            elem.click();
            document.body.removeChild(elem);
        }
    }

下载文件。

这使得通过单个处理程序调用以及 return 在处理程序内部生成的其他信息(例如成功和消息)下载多个文件成为可能。 handler.

成功return调用Download方法

然而,这确实需要站点在浏览器中具有下载多个文件的权限。