2012-01-25 18 views
0

私が達成しようとしているのは、ユーザーがSilverlightアプリケーションから複数のファイルをダウンロードできるようにすることです。これを行うには、DotNetZipライブラリとASP.NETハンドラを使用して、データベースからすべてのファイルを取得してクライアントに送信するようにすることにしました。それは良いアイデアのように思え、実装が簡単です。私はシンプルなハンドラを作成し、必要なすべてのコードを書き、すべてがうまくいった。私は多くのファイルとzipファイルを作成するとき大きなzipファイルを送信しようとすると接続が閉じられる

は、しかし、いくつかの理由で、問題があります。 Responseにデータを書き込もうとすると、例外がスローされています。

Private Sub MultipleFileDownload_Loaded(sender As Object, e As EventArgs) Handles Me.Load 
    // initialize data and stuff 

    _context.Response.Clear() 
    _context.Response.BufferOutput = False 
    Me.ZipElementsIntoOutputStream(elementsToDownload) 
    _context.Response.End() 
End Sub 

Private Sub ZipElementsIntoOutputStream(elements As List(Of ElementImageFile)) 
    _context.Response.ContentType = "application/zip" 
    Dim archiveName As String = String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HHmmss")) 
    _context.Response.AddHeader("content-disposition", "attachment; filename=" + archiveName) 

    Using zip As New ZipFile() 
     For Each elementToDownload In elements.Where(Function(e) e IsNot Nothing AndAlso e.File IsNot Nothing) 
      Dim fileName = Me.GetUniqueFileName(elementToDownload, zip) 
      zip.AddEntry(fileName, elementToDownload.File) 
     Next 

     Using s As IO.MemoryStream = New IO.MemoryStream() 
      zip.Save(s) 
      s.Seek(0, IO.SeekOrigin.Begin) 
      Dim buffer(10000) As Byte 
      Dim length As Integer 
      Dim dataToRead As Long 
      dataToRead = s.Length 

      While dataToRead > 0 
       If (Me._context.Response.IsClientConnected) Then 
        length = s.Read(buffer, 0, 10000) 
        Me._context.Response.OutputStream.Write(buffer, 0, length) 
        Me._context.Response.Flush() 

        ReDim buffer(10000) 
        dataToRead = dataToRead - length 
       Else 
        dataToRead = -1 
       End If 
      End While 

      'zip.Save(_context.Response.OutputStream) 
     End Using 
    End Using 
End Sub 

あなたは私がMemoryStreamを作成し、私はそれが同様の問題の解決策として示した見てきましたが、これは助けにはならなかったとして、Responseにデータの小片を送信しています見ることができるように。 Zipファイルを直接Responseに保存すると、まったく同じエラーが表示されます。

BufferOutputプロパティがFalseに設定されているため、すぐにダウンロードが開始されますが、Trueに変更しても何も変更されません。

私が送信しようとしているzipファイルを約248メガバイトであり、これは私にエラーを与えます。いくつかの要素を削除し、zipファイルが約220メガバイトの場合、すべて正常に動作するようです。

誰でも知っていますか、この動作の理由は何ですか?どうすればこの問題を解決できますか?zipファイルを送信してもこのエラーは発生しません。

答えて

0

結局のところ、問題はDotNetZipASHXハンドラではありませんでした。このハンドラに渡される非常に長いクエリ文字列に問題がありました。 Internet Explorerは、クエリ文字列で最大2048文字を処理できます。残念ながら私は長い文字列を渡しました。

IE問題を示すために何らかのエラーを出す代わりに、サーバーへの接続を作成し、応答を待っていないのにすぐに接続を切断しました。これは問題の原因でした。

修正されたクエリ文字列の長さの問題も修正されました。この動作と大きなファイルのダウンロードが正しく機能します。

関連する問題