2

我在 SQL Server 2005 中有一个存储过程,它生成一个 170 兆字节的 XML 文件(使用SELECT FOR XML

如何在 ASP.NET 中流式传输此 XML 以在 Web 浏览器中作为文件下载?

4

3 回答 3

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 标头,如下所示。这真的是一个单独的问题。

我同意@Metropolitan 的观点,即您的输出大小对于网络下载来说非常大。我只是想按要求回答这个问题,但你可能不得不重新考虑这个问题。

于 2013-05-10T19:37:11.187 回答
1

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
        }
    }
于 2013-05-10T19:45:48.093 回答
-1

我很确定您需要编写一些 SQL SERVER DLL 来压缩该 XML 文件并将其保存在本地。

在此之后,它应该在该文件准备好的某个表中插入一些行。

也许您必须将 WCF 服务添加到能够流式传输该 ZIP 文件的 ASP .NET 项目中。

像这样的东西...

无论如何 170 Mb XML hmmmm 听起来你必须审查很多事情以减少输出大小......

于 2013-05-10T19:34:52.797 回答