如果调用Response.Close(),文件下载将被截断

时间:2009-11-16 19:13:53

标签: c# .net download

好的,所以我有一个页面,它从web服务中获取文件作为Byte [],然后我给用户保存/取消对话框以保存该文件。该文件可以是xml或cvs格式。下载文件时,文件不完整,例如这是文件应该具有的内容:
美元,欧元,欧元,1.2,1.1,11 / 15 / 2009,15:23:27个
美元,澳元,澳大利亚,1.25,1.15,11 / 15 / 2009,15:23:27

但是当从浏览器中保存时它只有::
美元,欧元,欧元,1.2,1.1,11 / 15 / 2009,15:23:27个
USD,AUD,澳大利亚,1.25,1。

这是我的代码:

Response.Buffer = true;
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); 
Response.AddHeader("Content-Length", MyFile.Length.ToString()); 
FileInfo file = new FileInfo(fileName); 
Response.ContentType = Utility.ReturnExtension(file.Extension.ToLower()); 
Response.BinaryWrite(MyFile); 
Response.Flush(); 
Response.Close(); 
Response.End();

我已经通过编写文件确保我从webservice获得的byte []是可以的 在我的机器上使用以下代码:

StreamWriter writer = null;
string blah = System.Text.ASCIIEncoding.ASCII.GetString(MyFile);
writer = File.CreateText(Server.MapPath(filePath+fileName));
writer.Write(blah);
writer.Close();
writer.Dispose();

如果我删除了Close()和End(),那么整个文件将使用页面中的一些HTML代码进行渲染。 如果我首先在本地计算机上创建/写入文件然后执行Response.TransmitFile(file),我会得到完整的文件(只有XML格式)。

我不确定我做错了什么。也许它只是非常简单。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:8)

如果我在Response.Close()之后调用Response.Flush(),我遇到了在响应中截断CSV文件的问题。

我的解决方案是替换它:

 try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.Flush(); 
      response.Close();
 }

有了这个:

try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.End();
 }

Response.End()会将所有缓冲的内容刷新到客户端。尝试从响应处理程序中删除Response.Close()

答案 1 :(得分:1)

尝试删除

Response.AddHeader("Content-Length", MyFile.Length.ToString()); 

当你这样做时,看看你是否得到了完整的文件。如果你这样做,那么你的文件长度会很短。

答案 2 :(得分:0)

您可能正在填写响应缓冲区。尝试发送无缓冲,或者如果不起作用,则将文件分散到几个binarywrite调用上,并在每次调用后刷新缓冲区。