将 CSV 写入 Response.OutputStream 也会写入 HTML

Writing out a CSV to Response.OutputStream also writes out the HTML

我正在尝试编写一个 ASP.NET 页面,允许用户以 CSV 格式从数据库下载他们的数据。我已经编写了下面的代码,它位于后面的代码中,单击按钮时将 运行 。这是我写的:

  private void RunBackup()
  {
    Button1.Enabled = false;

    Response.ContentType = "text/csv";
    Response.AddHeader("content-disposition", "attachment; filename=backup.csv");

    try
    {
        using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString))
        using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8))
        {
            var queryString = "SELECT * FROM [Data] WHERE [ID] = @id";
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Parameters.Add("@id", SqlDbType.Int).Value = userId;
            connection.Open();
            SqlDataReader reader = command.ExecuteReader();

            // Write header row.
            for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++)
            {
                if(columnCounter > 0)
                {
                    writer.Write(separator);
                }
                writer.Write(reader.GetName(columnCounter));
            }
            writer.WriteLine(string.Empty);

            // Write out the data.
            while (reader.Read())
            {
                // Write out the column.
                for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) 
                {
                    if (columnCounter > 0) 
                    {
                        writer.Write(separator);
                    }
                    writer.Write(reader.GetValue(columnCounter).ToString().Replace(",", ";").Replace("\"", " "));
                }
                writer.WriteLine(string.Empty);
            }

            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
    }
    catch(Exception e)
    {

    }
    finally
    {
        Button1.Enabled = true;
    }

效果很好,除了我不仅获得了包含 SQL 数据的 CSV 文件,而且我还获得了 - 在文件的最后 - HTML页面的。尽管我怀疑这与 Response headers 或 Response.OutputStream.

的输出有关,但我无法弄清楚它在做什么

如果能指出正确的方向,我将不胜感激。

默认情况下 ASP.Net 将表单呈现为 Html 并将其放入响应中,除非您告诉相反的情况,以便将表单 returns 发送给客户端。这就是为什么您会在下载的文件中看到一个 Html 页面。

在您的 RunBackup() 方法末尾添加此代码。

Response.End();

这将阻止向您的文件中添加更多内容。

您的代码已经包含 CompleteRequest(),这是优雅地跳过管道中的其他事件并准备结束请求的重要部分。如果应用程序配置为缓冲输出,Response.Flush();可以加。