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

2 .net c# 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

但是当从浏览器中保存时它只有::
USD,EUR,Euro,1.2,1.1,11/15/2009,15:23:27
USD,AUD,Australian,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();
Run Code Online (Sandbox Code Playgroud)

我已经通过以下代码在我的机器上编写文件来确保我从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();
Run Code Online (Sandbox Code Playgroud)

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

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

小智 8

我遇到了一个问题,如果我打电话Response.Close()后,响应中的CSV文件被截断了Response.Flush().

我的解决方案是取代这个:

 try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.Flush(); 
      response.Close();
 }
Run Code Online (Sandbox Code Playgroud)

有了这个:

try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.End();
 }
Run Code Online (Sandbox Code Playgroud)

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