ASP.NET Overflow or underflow in the arithmetic operation when returning large file bigger 1 GB

后端 未结 3 852
攒了一身酷
攒了一身酷 2021-02-04 02:47

I went across some sort of limitation in ASP.NET. I reduced the problem into a sample project in ASP.NET MVC Project (created with Visual Studio 2010 and .NET 4) and the problem

3条回答
  •  谎友^
    谎友^ (楼主)
    2021-02-04 03:45

    References:

    Download function failing with big file sizes

    How to increase request timeout in IIS?

    https://msdn.microsoft.com/en-us/library/system.web.httpserverutility.scripttimeout%28v=vs.110%29.aspx

    What worked for me:

                If File.Exists(file2return) Then
                Dim finfo As New FileInfo(file2return)
                Response.Clear()
                Response.Buffer = False
                Response.BufferOutput = False
                Response.ContentType = "application/octet-stream"
                Response.AddHeader("Content-Length", finfo.Length.ToString)
                Response.AddHeader("Content-Disposition", "attachment; filename=" + finfo.Name)
                WriteBytesToResponseBuffered(file2return)
                Response.End()
    

    The function that actually writes to the stream output:

        Private Sub WriteBytesToResponseBuffered(file2return As String)
        Const MAX_BUFFER As Integer = 1024 ^ 2 ' = 1 048 576 bytes = 2^20 = 1 mebibyte = 1 MiB
        Dim BytesRead As Integer = 0
        Try
            Dim Buffer As Byte() = New Byte(MAX_BUFFER - 1) {}
            Using myFileStream As New FileStream(file2return, FileMode.Open, FileAccess.Read)
                While (InlineAssignHelper(BytesRead, myFileStream.Read(Buffer, 0, MAX_BUFFER))) > 0
                    Response.OutputStream.Write(Buffer, 0, BytesRead)
                End While
            End Using
        Catch ex As Exception
        End Try
    End Sub
    Private Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
        target = value
        Return value
    End Function
    

    The web.config part: Without this the serving of the page would be terminated if the serving took too much time. This parameter only works when compilation debug="false"

      
    
    

    It is advisable to change this value only for the page serving the file. Instead of changing web.config put this on the page_load:

    Page.Server.ScriptTimeout = 60 * 20 ' 20 minutes in this case
    

提交回复
热议问题