Обработчик загрузки файла asp.net VB.net не работает должным образом

У меня есть большой файл (около 2 ГБ) для распространения среди наших клиентов, мой веб-сайт написан 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

Моя проблема в том, что этот обработчик иногда не мог работать должным образом. Большинство клиентов могут загрузить его с помощью этого обработчика, но некоторые клиенты нажимают ссылку для загрузки, он будет бесконечно ждать ответа сервера, после долгого ожидания он показывает, что страница ошибки говорит, что IE не может отобразить веб-страницу. какой-то клиент пытается загрузить файл из IE8, он сразу покажет страницу с ошибкой. Я очень ценю, что любой может помочь с этой проблемой. Спасибо!


person Maxime.Pan    schedule 27.03.2017    source источник
comment
2 ГБ - я думаю, это будет слишком много, чтобы быть практичным. Почему бы не поместить файл в Dropbox и не отправить ссылку своему клиенту?   -  person sh1rts    schedule 28.03.2017
comment
Что если вы измените Reponse.Close() на Response.End()?   -  person Ryan Mendoza    schedule 28.03.2017
comment
Когда я использую этот обработчик для загрузки небольшого файла (100 МБ), он работает очень хорошо, поэтому может ли кто-нибудь сказать мне, есть ли какие-либо ограничения response.transmitFile?   -  person Maxime.Pan    schedule 28.03.2017
comment
Похоже, это просто тайм-аут ... IIS отслеживает ограничение на то, сколько времени вы можете потратить на обработку запроса, прежде чем он просто убьет его. Браузеры делают то же самое. Передача файла размером 2 ГБ занимает много времени, и вы, вероятно, столкнетесь с этим пределом.   -  person Joel Coehoorn    schedule 29.03.2017
comment
@JoelCoehoorn, я полностью согласен с вами, не могли бы вы дать мне несколько советов по поводу этого лимита? Какую часть IIS мне нужно настроить? Я использую Win2012 R2 + IIS 8.5   -  person Maxime.Pan    schedule 29.03.2017


Ответы (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
person Prescott Chartier    schedule 29.03.2017
comment
Раньше я использовал метод Response.WriteFile, но поскольку размер моего файла составляет 2 ГБ, серверу требуется много времени для буферизации файла, и когда он буферизует файл, использование ОЗУ сервера всегда становится очень высоким, поэтому клиенту нужно почти 10 секунд дождаться начала загрузки. После того, как я перешел на метод Response.TransmitFiles, он стал лучше, чем раньше, но все еще есть некоторые проблемы. - person Maxime.Pan; 29.03.2017
comment
У меня были пользователи, которые скачивали ›файлы по 2 ГБ. Никогда не было проблем с буферизацией сервера. Какую версию Windows вы используете? Я использую Windows Server 2008 R2. - person Prescott Chartier; 29.03.2017
comment
Моя среда - Windows 2012 R2 + IIS 8.5, буду очень признателен, если вы предложите какие-либо предложения по оптимизации IIS. - person Maxime.Pan; 29.03.2017
comment
Для таких больших файлов я просто помещаю ссылку на файл. Аналогично myserver.com/folder/filename.ext. Браузер сразу начинает загрузку, и я никогда не наблюдал проблем на стороне сервера. Никакой специальной конфигурации, установка сервера Windows по умолчанию на сервере Dell 2950 с 32 ГБ или оперативной памятью. - person Prescott Chartier; 29.03.2017
comment
мой сценарий состоит в том, чтобы авторизовать пользователя до того, как он начнет загрузку, поэтому мне нужно использовать обработчик файлов, но отправить им настоящую ссылку на файл. - person Maxime.Pan; 29.03.2017
comment
Для этого я использую авторизацию Windows, я устанавливаю свойства папки только для того, чтобы позволить определенным пользователям получать доступ к файлам, а в IIS настраивал папку для использования Windows Auth (или что-то подобное, записывая это в моей голове), добавляю пользователей в систему и когда пользователь щелкает ссылку, браузер запрашивает имя пользователя и пароль. Я делаю это не часто, поэтому не трачу много времени на что-то особенное. Если пользователю требуется 1000 часов, чтобы загрузить файл, я полагаю, что это их проблема :), у меня просто никогда не было проблем на стороне сервера. - person Prescott Chartier; 29.03.2017