我正在使用ASP.NET HttpHandler进行测试,以便下载直接在响应流上写入的文件,而且我对于执行此操作的方式并不确定。这是一个实例方法,在今后的文件可以存储在一个BLOB在数据库:有关在ASP.NET响应流上编写的一些问题
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();
}
}
}
但是,我不知道这是否是正确的或有更好的方法来做到这一点。 我的问题是:
- 当我打开与浏览器的网址,会出现“保存文件”对话框......但它似乎是在服务器启动已经将数据推入流之前,我点击“保存“,这是正常的吗?
- 如果我删除了“response.Flush()”这一行,当我用浏览器打开url时,...我看到web服务器如何推送数据但“保存文件”对话框没有出现, (或者至少不是以合理的时间方式)为什么?
- 当我用WebRequest对象打开url时,我发现HttpResponse.ContentLength是“-1”,尽管我可以读取流并获取文件。什么是-1的含义? HttpResponse.ContentLength何时显示响应的长度?例如,我有一个方法检索一个大的xml压缩作为二进制流,但在这种情况下...当我用WebRequest访问它时,在HttpResponse中我实际上可以看到ContentLength与流的长度,为什么?
- 什么是Byte []数组的最佳长度,我用它作为缓冲区以实现Web服务器的最佳性能?我读过的是4K和8K之间......但我应该考虑哪些因素才能做出正确的决定。
- 此方法是否会扩大IIS或客户端内存使用量?或者它实际上是否正确缓冲了传输?
对不起,这么多问题,我在网络的发展很新:P
干杯。
你还应该看看这里的锅炉板HttpHandler实现(http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx)和这里(http://www.hanselman.com /blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx)。 – R0MANARMY 2010-04-02 21:56:22
您的学习方式值得赞赏。继续 。 – 2013-01-31 05:57:36
这将工作: [http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet][1] [ 1]:http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet – 2014-09-16 11:54:26