将 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();可以加。
我正在尝试编写一个 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();可以加。