我正在使用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将显示响应的长度?例如,我有一个检索大型XML压缩为二进制流的方法,但在这种情况下...当我使用WebRequest访问它时,在HttpResponse中我实际上可以看到ContentLength与流的长度相同,为什么?
- 作为用于Web服务器性能最佳的缓冲区的Byte[]数组的最优长度是多少?我读过介于4K和8K之间...但是我应该考虑哪些因素以做出正确的决策?
- 此方法是否会增加IIS或客户端内存使用的膨胀?或者它是否实际上正确地缓冲传输?
抱歉问了这么多问题,我在Web开发方面还是很新手:P
干杯。