我在SQL Server 2005中有一个存储过程,它生成一个170兆字节的XML文件(使用SELECT FOR XML
)
在ASP.NET中,如何将此XML流式传输以便在Web浏览器中作为文件下载?
答案 0 :(得分:2)
这样的事情已经为我工作了一段时间。请注意,您必须根据自己的情况定制:
var settings = new XmlWriterSettings {
// your settings
};
using (var xmlWriter = XmlWriter.Create(response.Output, settings))
using (var connection = YourConnection())
using (var command = CreateCommand(sql, connection, dbParams) as SqlCommand )
{
try {
connection.Open();
using (var reader = command.ExecuteXmlReader())
{
while (reader.Read())
xmlWriter.WriteNode(reader, true);
}
}
catch ( Exception ex )
{
// log, whatever
throw;
}
}
此外,如果您想要进行响应下载,则必须设置HTTP标头,例如this。这真的是一个单独的问题。
我同意@Metropolitan的说法,您的输出大小对于网络下载而言非常大。我只想回答问题,但你可能不得不重新考虑这个问题。
答案 1 :(得分:1)
Harpo的答案很好但你需要准备好你的Response以使其在ASP.NET中运行。创建一个页面,您可以将其命名为“Download.aspx”。然后在Page_load中,您需要流式传输内容。
protected void Page_Load(object sender, EventArgs e)
{
try
{
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
if (Request.QueryString["key"] != null)
{
Response.AppendHeader("content", contentType);
Response.AppendHeader("content-disposition", "attachment; filename=something.xml");
Response.ContentType = "text/xml";
// Here you would call your sproc (see harpo's answer)
// and write to Response.Output
}
HttpContext.Current.ApplicationInstance.CompleteRequest();
Response.End();
}
catch (Exception ex)
{
// Handle your errors
}
}
答案 2 :(得分:-1)
在此之后,它应该在某个表中插入一些该文件准备就绪的行。
像这样......
无论如何170 Mb XML hmmmm听起来你必须要审查很多东西以减少输出尺寸......