【问题标题】:asp.net VB.net file download handler not work properlyasp.net VB.net 文件下载处理程序无法正常工作
【发布时间】:2017-03-27 21:47:19
【问题描述】:

我有大文件(大约 2GB)要分发给我们的客户,我的网站是由 asp.net vb 编写的,这是我的文件下载处理程序:

Public Class FileHandler
    Implements IHttpHandler
    Public Sub ProcessRequest(ByVal httpcontext As HttpContext) Implements IHttpHandler.ProcessRequest
        If HttpContext.User.Identity.IsAuthenticated Then
            Dim FileName As String = HttpContext.Request.QueryString("File")            
            HttpContext.Response.Buffer = False
            HttpContext.Response.Clear()
            HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
            HttpContext.Response.ContentType = "application/exe"
            HttpContext.Response.TransmitFile("~/download/ExE/" & FileName)
            HttpContext.Response.Flush()
            HttpContext.Response.Close()            
        End If
    End Sub
    Public ReadOnly Property IsReusable As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property
End Class

我的问题是这个处理程序有时不能正常工作。 大部分客户都可以通过这个handler下载,但是有些客户点击下载链接,会无休止地等待服务器的响应,等待很长时间后,显示错误页面,说IE无法显示网页。有些客户尝试从 IE8 下载文件,它会直接显示错误页面。 我非常感谢任何人可以帮助解决这个问题。谢谢!

【问题讨论】:

  • 2GB - 我认为这太大了,不实用。为什么不将文件放入 Dropbox 并发送链接给您的客户?
  • 如果将Reponse.Close() 更改为Response.End() 会怎样?
  • 当我使用这个处理程序下载小文件(100MB)时,它工作得很好,所以有人能告诉我response.transmitFile有什么限制吗?
  • 听起来好像只是超时了... IIS 会跟踪您在处理请求之前可以花多长时间处理请求的限制。浏览器做同样的事情。传输 2GB 的文件需要很长时间,而且您可能会遇到该限制。
  • @JoelCoehoorn,我完全同意你的看法,你能给我一些关于这个限制的建议吗?我需要配置IIS的哪一部分?我正在使用 Win2012 R2 + IIS 8.5

标签: asp.net vb.net filehandler


【解决方案1】:

我使用一个按钮或只是一个指向文件本身的普通链接,我从来不需要使用处理程序来下载文件。

例如,在 aspx 上,我有一个按钮,在后面的代码中,我使用响应对象将用户发送到文件:

Protected Sub Button_DownloadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_DownloadFile.Click

    Response.AddHeader("Content-Disposition", "attachment; filename=TheFileName.ext")
    Response.WriteFile("~/App_Data/TheFileName.ext")

END SUB

【讨论】:

  • 我之前使用过Response.WriteFile方法,但是由于我的文件是2GB,所以服务器需要很长时间来缓冲文件,并且在缓冲文件时,服务器RAM的使用总是到非常高,所以客户端需要将近 10 秒来等待下载开始。改成 Response.TransmitFiles 方法后,比以前好多了,但还是有一些问题。
  • 我让用户下载了 >2gb 的文件。从来没有服务器缓冲的问题。您使用的是什么版本的 Windows?我使用的是 Windows Server 2008 R2。
  • 我的环境是Windows 2012 R2 + IIS 8.5,如果您能提供有关如何优化IIS的任何建议,将不胜感激
  • 对于像这样的大文件,我只是放了一个指向该文件的链接。类似于myserver.com/folder/filename.ext。浏览器立即开始下载,我从未在服务器端观察到问题。无特殊配置,Windows 服务器默认安装在 32gb 或 ram 的戴尔 2950 服务器上。
  • 我的场景是在用户开始下载之前授权用户,所以我需要使用文件处理程序但将文件的真实链接发送给他们。
猜你喜欢
  • 2014-10-23
  • 2022-07-22
  • 2014-07-27
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多