在asp.net中向客户端导出大量数据

Posted

技术标签:

【中文标题】在asp.net中向客户端导出大量数据【英文标题】:Export large amounts of data to client in asp.net 【发布时间】:2010-10-24 15:35:00 【问题描述】:

我需要通过网络将大量数据 (~100mb) 从 sql 表导出给用户。这样做的最佳解决方案是什么?一种想法是将数据导出到数据库服务器上的文件夹,压缩它(通过某种方式),然后为用户提供下载链接。还有其他方法吗?另外,我们可以从 sql server 中压缩数据吗?

欢迎任何方法。

【问题讨论】:

您的目标格式是什么?最终用户最终会下载什么? Xml? CSV?一个实际的 Sql Server 数据库文件? 一个 Excel 文件/csv 文件。两种格式都可以。 【参考方案1】:

我不会占用数据库等待用户下载 100Mb,即使对于高速用户也是如此。当用户请求文件时,让他们指定一个电子邮件地址。然后调用异步进程来提取数据,将其写入临时文件(毕竟内存中不希望 > 100mb),然后将临时文件压缩到存储位置,然后向用户发送一封包含下载链接的电子邮件文件。

【讨论】:

我唯一要补充的是需要清理旧文件(即定期删除那些 >100MB 的文件);使用简单的脚本和计划任务很容易做到。并且不要忘记让用户知道该文件仅在有限的时间内可用。【参考方案2】:

您可以使用文件响应页面请求:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=yourfile.csv");
Response.ContentType = "text/plain";

请务必关闭缓冲,以便 IIS 可以在您构建第二部分时开始发送文件的第一部分:

Response.BufferOutput = false;

之后,您可以开始编写文件,如下所示:

Response.Write("field1,field2,field3\r\n");

文件完全写入后,结束响应,因此 ASP.NET 不会将网页附加到您的文件中:

Response.End();

这样,您不必在网络服务器上写入文件,只需在内存中创建文件并将它们发送给您的用户。

如果需要压缩,你可以用同样的方法写一个 ZIP 文件。这是一个很好的free library 来创建 ZIP 文件。

【讨论】:

注意:如果数据库和最终用户之间没有缓冲,进程将持有锁,直到整个行集被发送。如果您只是执行 READ COMMITTED,它不会有很多锁,但仍然会有一些锁。例如,如果表的任何写入者试图升级,这将禁止他们获取表锁。对于高速最终用户来说可能还不错,但对于慢速链接可能会很糟糕。 +1 Response.BufferOutput 是一个很好的“快速修复”。我仍然觉得@Goblyn27 的解决方案是更“正确”的方法,但是当您时间紧迫并且用户现在需要他们的报告时,禁用输出缓冲区效果很好。【参考方案3】:

您的方法效果很好。如果您需要多次执行此过程,SSIS + 7zip 可能对自动化流程很有用。

【讨论】:

【参考方案4】:

如果 XML 没问题,一种方法是选择数据“FOR XML”,如下所示: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk

然后将原始 XML 作为内容类型直接吐出到浏览器:text/xml。还要确保在您的 Web 服务器上为具有 XML 扩展名的文件设置 Gzip 压缩。 http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

这会将 XML 文件缩小到传输大小的 1/3 或 1/4。由于 XML 文件中固有的浪费空间,这不是性能最高的选项,但很大程度上取决于您最终要寻找的格式。

另一种选择是使用免费的 CSharpZipLib 将 XML(或您想要的任何格式)压缩成用户可以下载的 zip 文件。沿着这些思路,如果这是经常使用的东西,您可能需要考虑将 zip 文件缓存并存储在具有某种到期时间的 Web 服务器上,这样它就不会为每个请求重新生成。

【讨论】:

【参考方案5】:

下载链接是一个完全有效且合理的解决方案。另一种方法是自动将用户重定向到该文件,这样他们就不需要单击链接。这实际上取决于您的工作流程和 UI 体验。

我建议不要在 SQL Server 引擎中实现压缩。而是查看 DotNetZip 库(或 System.IO.Conpression,如果您认为您的用户具有解压缩 gzip 存档的能力)并在 Web 应用程序中实现压缩。

【讨论】:

以上是关于在asp.net中向客户端导出大量数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 2.1 中向 Visual Studio 添加新的 Razor 页面模板?

如何在 ASP.NET MVC 中向客户端发送 XML 文件

asp.net 按钮单击未通过 jquery 在隐藏字段中触发大量数据

传递需要的大量 Json 对象时如何改进 Asp.net Mvc 应用程序?

Asp.Net 将大量数据从视图发送到控制器

Azure 中的 ASP.NET WebApp 使用大量 CPU