我在 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 听起来你必须审查很多事情以减少输出大小......