我在 SQL Server 2005 中有一个存储过程,它生成一个 170 兆字节的 XML 文件(使用SELECT FOR XML
)
如何在 ASP.NET 中流式传输此 XML 以在 Web 浏览器中作为文件下载?
我在 SQL Server 2005 中有一个存储过程,它生成一个 170 兆字节的 XML 文件(使用SELECT FOR XML
)
如何在 ASP.NET 中流式传输此 XML 以在 Web 浏览器中作为文件下载?
这样的事情已经为我工作了一段时间。请注意,您必须根据自己的情况对其进行调整:
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 标头,如下所示。这真的是一个单独的问题。
我同意@Metropolitan 的观点,即您的输出大小对于网络下载来说非常大。我只是想按要求回答这个问题,但你可能不得不重新考虑这个问题。
Harpo 的回答很好,但您需要准备好响应以使其在 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
}
}
我很确定您需要编写一些 SQL SERVER DLL 来压缩该 XML 文件并将其保存在本地。
在此之后,它应该在该文件准备好的某个表中插入一些行。
也许您必须将 WCF 服务添加到能够流式传输该 ZIP 文件的 ASP .NET 项目中。
像这样的东西...
无论如何 170 Mb XML hmmmm 听起来你必须审查很多事情以减少输出大小......