向Response.OutputStream写出CSV也会写出HTML

时间:2017-12-07 01:10:09

标签: c# asp.net csv httpresponse export-to-csv

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

  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标题或与Response.OutputStream的输出有关。

我希望任何指向正确的方向。

1 个答案:

答案 0 :(得分:0)

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

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

Response.End();

这样可以防止将更多内容添加到您的文件中。

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