我正在使用 ASP.NET HttpHandler 进行测试,以下载直接写入响应流的文件,但我不太确定自己的操作方式。这是一个示例方法,将来该文件可以存储在数据库中的 BLOB 中:
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
但是,我不确定这是否正确或有更好的方法来做到这一点。我的问题是:
- 当我用浏览器打开 url 时,会出现“保存文件”对话框......但在我点击“保存”之前,服务器似乎已经开始将数据推送到流中,这正常吗?
- 如果我删除“response.Flush()”行,当我用浏览器打开 URL 时,...我看到 Web 服务器如何推送数据但“保存文件”对话框没有出现,(或在至少不是以合理的时间方式)为什么?
- 当我使用 WebRequest 对象打开 url 时,我看到 HttpResponse.ContentLength 为“-1”,尽管我可以读取流并获取文件。-1 是什么意思?什么时候 HttpResponse.ContentLength 会显示响应的长度?例如,我有一个方法可以检索一个用 deflate 压缩的大 xml 作为二进制流,但在这种情况下......当我使用 WebRequest 访问它时,在 HttpResponse 中我实际上可以看到 ContentLength 和流的长度, 为什么?
- 我用作缓冲区以在 Web 服务器中获得最佳性能的 Byte[] 数组的最佳长度是多少?我读过它介于 4K 和 8K 之间……但是我应该考虑哪些因素才能做出正确的决定。
- 这种方法是否会增加 IIS 或客户端内存使用量?或者它实际上是否正确缓冲了转移?
抱歉有这么多问题,我是网络开发的新手:P
干杯。