0

Varbinary(Max)基本的に圧縮されたデータである列を持つ SQL Server テーブルがあります。

マイページでは、ユーザーがこのデータをダウンロードできます(通常のユーザー認証の後)。

以前はデータサイズが小さくても問題なく動作していましたが、時間の経過とともにデータも大きくなっています。保存ダイアログが表示される前に、基本的に待機時間という多くの問題に直面しています。

コード:

 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"];

そのラグがある場所です。

私のプラットフォームは、.NET Framework 4.0、SQL Server 2008、C# 分離コードを使用した ASP.Net です。

4

2 に答える 2

1

これは役立つかもしれません:

Response.AppendHeader("Content-Type", "application/gzip ");
Response.OutputStream.Write((Byte[])reader["backupdata"],0,((Byte[])reader["backupdata"]).Length); 

また、sql2012 のファイルストリーム テーブルを使用して、ファイルを直接保存できます。

于 2013-10-22T13:15:58.507 に答える
1

応答をストリーミングする必要があります。メモリ内のファイル全体を読み取ってから書き出すことはスケーリングされず、要求の数またはファイルのサイズが増加するにつれてサーバーを使い果たし始めます。

ASP.Net MVCおよびFILESTREAM MVC を介して SQL Server からイメージをダウンロードおよびアップロードする: SQL Serverからイメージをダウンロードおよびアップロードして、これを行う方法の例を確認してください。MVC を使用せずにそのまま ASP.NET を使用すると、より簡単に実行できますが、考え方は同じです。

  • ストリーミング API を使用してデータベースの応答を読み取り (具体的SqlCommand.ExecuteReadeには をCommandBehavior.SequentialAccess使用)、応答をチャンクで読み取りますSqlDataReader.GetBytes()(フラグの重要性について MSDN で切り出された小さな部分にもう一度注意してくださいSequentialAccess...)
  • ストリーミング API を使用して HTTP 応答を書き込みます。Response.BinaryWrite()しましょう。
于 2013-10-22T11:35:40.213 に答える