我有一个 SQL Server 表,其中包含Varbinary(Max)
基本上是压缩数据的列。
我的页面允许用户下载此数据(在通常的用户身份验证之后)。
以前它工作得很好,数据量较小,但现在随着时间的推移,数据也越来越大。我面临很多问题,基本上是在“保存”对话框出现之前等待一段时间。
Code:
while (reader.Read())
{
Response.Buffer = false;
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/gzip";
Response.AddHeader("content-disposition", "attachment;filename="
+ "vbet_1_1.sdf.gz");
byte[] bytes = (Byte[])reader["backupdata"]; // STUCK HERE
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
在调试器中,我可以看到
byte[] bytes = (Byte[])reader["backupdata"];
就是滞后所在。
我的平台是 ASP.Net,带有 .NET Framework 4.0、SQL Server 2008、C# 代码隐藏
您需要将响应流式传输回来。读取内存中的整个文件然后将其写出不会扩展,并且随着请求数量的增加,您将开始耗尽服务器的资源or文件的大小增加。
看一下通过 ASP.Net MVC 从 SQL Server 下载和上传图像 http://rusanu.com/2010/12/28/download-and-upload-images-from-sql-server-with-asp-net-mvc/ and FILESTREAM MVC:从 SQL Server 下载和上传图像 http://rusanu.com/2011/02/06/filestream-mvc-download-and-upload-images-from-sql-server/查看如何执行此操作的示例。由于您不使用 MVC,而是直接使用 ASP.NEt,因此您可以做得更简单,但想法是相同的:
- 使用流式 API 读取数据库响应(具体来说
SqlCommand.ExecuteReade
with CommandBehavior.SequentialAccess http://msdn.microsoft.com/en-us/library/system.data.commandbehavior.aspx)并使用分块读取响应SqlDataReader.GetBytes() http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getbytes.aspx(再次注意 MSDN 上关于重要性的小片段SequentialAccess
旗帜...)
- 使用流式 API 编写 HTTP 响应。Response.BinaryWrite() http://msdn.microsoft.com/en-us/library/system.web.httpresponse.binarywrite.aspx会做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)