PRB: Response.WriteFile не удается загрузить файлы большого размера

Переводы статьи Переводы статьи
Код статьи: 812406 - Vizualiza?i produsele pentru care se aplic? acest articol.
Внимание
Упомянуты программные продукты независимых производителей, упомянутые в данной статье компаниями, независимыми от корпорации Майкрософт. Корпорация Майкрософт не дает никаких гарантий явных или подразумеваемых, относительно производительности или надежности этих продукты.
Развернуть все | Свернуть все

В этой статье

Проблема

При попытке использовать Response.WriteFile метод для загрузки больших файлов загрузки может не отвечать на запросы, и затем появляется одно из следующих сообщений об ошибке:
Страницы не удается отобразить
-ИЛИ-
Серверное приложение Недоступен

Вы пытаетесь получить доступ на этот веб-приложения Веб-сервер недоступен. Нажмите кнопку «Обновить» в вашем Веб-обозреватель, чтобы повторить запрос.

Замечание администратора: Ошибка сообщения, подробно описывающий причину сбоя данного конкретного запроса можно найти в журнал событий системы веб-сервера. Ознакомьтесь с этой записью в журнале обнаружить причину возникновения этой ошибки.
Кроме того, может появиться следующее сообщение об ошибке в журнале событий приложений:

Aspnet_wp.exe (или W3wp.exe, для приложений, работающих в Microsoft Internet информации службы IIS 6.0) непредвиденной остановки.

В ходе этого процесса также можно заметить увеличение использования памяти веб-сервера.

Причина

Конфигурации оборудования компьютера веб-сервера Определяет максимальный размер файла, можно успешно загрузить. При ASP.NET рабочий процесс (Aspnet_wp.exe или W3wp.exe для приложений, работающих в службах IIS 6.0 [IIS]) выполнение запроса загрузки файла появляется диалоговое окно загрузки файла. В ASP.NET рабочий процесс запускается для отправки данных в Microsoft Internet Данные службы процесс (Inetinfo.exe или Dllhost.exe). Это не так Подождите, пока вы щелкните ОК.

В зависимости от Конфигурация компьютера IIS процесс обработки данных, или данные могут быть буфер в памяти. Если файл имеет большой размер, данные заносятся в память во время обмена данными между этими двумя процессами. Это может привести к увеличение использования памяти на сервере. Ошибка возникает из-за ограничения памяти на веб-сервере.

Временное решение

Чтобы обойти эту проблему, воспользуйтесь одним из следующих методы:
  • Получение данных в небольшие фрагменты, а затем переместите данные выходной поток для загрузки. Следующий код показывает, как сделать Это.

    Важные Если задано значение Отладка атрибут элемента компиляции ЛОЖЬ в файле Web.config приложения ASP.NET приложения, необходимо установить Server.ScriptTimeout свойство, соответствующее значение для размера файла загрузки. По умолчанию Server.ScriptTimeout имеет значение 90 секунд. Тем не менее, когда Отладка атрибут имеет значение ИСТИНА, Server.ScriptTimeout значение устанавливается для очень больших 30,000,000 секунд. Как разработчик необходимо учитывать влияние, это может оказать на поведение приложения ASP.NET веб-приложения.

    Кроме того, в коде ниже, вы должны быть уведомлены о значения параметров, которые используются с FileStream конструктор. Значения перечисления являются указанная сделать существенно повлиять на функции, предоставляемые. Для Дополнительные сведения можно найти на FileStream ссылка вССЫЛКИ раздел.
    Visual Основные.NET код
          Dim iStream As System.IO.Stream
    
          ' Buffer to read 10K bytes in chunk:
          Dim buffer(10000) As Byte
    
          ' Length of the file:
          Dim length As Integer
    
          ' Total bytes to read:
          Dim dataToRead As Long
    
          ' Identify the file to download including its path.
          Dim filepath As String = "DownloadFileName"
    
          ' Identify the file name.
          Dim filename As String = System.IO.Path.GetFileName(filepath)
    
          Try
             ' Open the file.
             iStream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, _
                                                    IO.FileAccess.Read, IO.FileShare.Read)
    
             ' Total bytes to read:
             dataToRead = iStream.Length
             
             Response.ContentType = "application/octet-stream"
             Response.AddHeader("Content-Disposition", "attachment; filename=" & filename)
    
             ' Read the bytes.
                While dataToRead > 0
                    ' Verify that the client is connected.
                    If Response.IsClientConnected Then
                        ' Read the data in buffer
                        length = iStream.Read(buffer, 0, 10000)
    
                        ' Write the data to the current output stream.
                        Response.OutputStream.Write(buffer, 0, length)
    
                        ' Flush the data to the HTML output.
                        Response.Flush()
    
                        ReDim buffer(10000) ' Clear the buffer
                        dataToRead = dataToRead - length
                    Else
                        'prevent infinite loop if user disconnects
                        dataToRead = -1
                    End If
                End While
    
          Catch ex As Exception
             ' Trap the error, if any.
             Response.Write("Error : " & ex.Message)
          Finally
             If IsNothing(iStream) = False Then
                ' Close the file.
                iStream.Close()
             End If
             Response.Close()
          End Try
    
    Visual C#.NET код
    	System.IO.Stream iStream = null;
    
    	// Buffer to read 10K bytes in chunk:
    	byte[] buffer = new Byte[10000];
    
    	// Length of the file:
    	int length;
    
    	// Total bytes to read:
    	long dataToRead;
    
    	// Identify the file to download including its path.
    	string filepath  = "DownloadFileName";
    
    	// Identify the file name.
    	string  filename  = System.IO.Path.GetFileName(filepath);
    
    	try
    	{
    		// Open the file.
    		iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 
    					System.IO.FileAccess.Read,System.IO.FileShare.Read);
    
    
    		// Total bytes to read:
    		dataToRead = iStream.Length;
    
    		Response.ContentType = "application/octet-stream";
    		Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
    
    		// Read the bytes.
      		while (dataToRead > 0)
    		{
    			// Verify that the client is connected.
    			if (Response.IsClientConnected) 
    			{
    				// Read the data in buffer.
    				length = iStream.Read(buffer, 0, 10000);
    
    				// Write the data to the current output stream.
    				Response.OutputStream.Write(buffer, 0, length);
    
    				// Flush the data to the HTML output.
    				Response.Flush();
    
    				buffer= new Byte[10000];
    				dataToRead = dataToRead - length;
    			}
    			else
    			{
    				//prevent infinite loop if user disconnects
    				dataToRead = -1;
    			}
    		}
    	}
    	catch (Exception ex) 
    	{
    		// Trap the error, if any.
    		Response.Write("Error : " + ex.Message);
    	}
    	finally
    	{
    		if (iStream != null) 
    		{
    			//Close the file.
    			iStream.Close();
    		}
    		Response.Close();
    	}
    	
    Замена DownloadFileName с именем файл, размер которых превышает 100 мегабайт (МБ).

    -ИЛИ-
  • Предоставить ссылку для загрузки пользователем файл.

    -ИЛИ-
  • С помощью Microsoft ASP 3.0 для загрузки или использование программного обеспечения FileUp artisans с ASP.

    -ИЛИ-
  • Создание расширения ISAPI для загрузки файл.

    -ИЛИ-
  • Используйте FTP для загрузки файла.

Статус

Это поведение является особенностью.

Дополнительная информация

Действия по воспроизведению проблемы

  1. В Microsoft Visual Basic.NET или Microsoft Visual C# .NET, создайте новый проект веб-приложения. По умолчанию является файл WebForm1.aspx создан.
  2. Перетаскивание объект кнопки из набора инструментов для WebForm1.aspx.
  3. Дважды щелкните значок объект кнопки Чтобы открыть Нажмите кнопку события в представлении «Код».
  4. Вставьте следующий код в Button1 Нажмите кнопку событие.

    Visual Basic.NET код
    	' Identify the file to download including its path.
    	Dim filepath As String = DownloadFileName
    
    	' Identify the file name.
    	Dim filename As String = System.IO.Path.GetFileName(filepath)
    
    	Response.Clear()
    	
    	' Specify the Type of the downloadable file.
    	Response.ContentType = "application/octet-stream"
    
    	' Set the Default file name in the FileDownload dialog box.
    	Response.AddHeader("Content-Disposition", "attachment; filename=""" & filename & """")
    
    	Response.Flush()
    
    	' Download the file.
    	Response.WriteFile(filepath)

    Visual C#.NET код
    	// Identify the file to download including its path.
    	string filepath = DownloadFileName;
    
    	// Identify the file name.
    	string filename = System.IO.Path.GetFileName(filepath);
    
    	Response.Clear();
    
    	// Specify the Type of the downloadable file.
    	Response.ContentType = "application/octet-stream";
    
    	// Set the Default file name in the FileDownload dialog box.
    	Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
    
    	Response.Flush();
    
    	// Download the file.
    	Response.WriteFile(filepath);
  5. Замена DownloadFileName этим кодом Имя файла, размер которых превышает 100 МБ.
  6. На Отладка меню, нажмите кнопкуНачало.
  7. Нажмите кнопку Button1.

Ссылки

Для получения дополнительных сведений щелкните следующие номера статей базы знаний Майкрософт:
307603 Как следует двоичные файлы для обозревателя, с помощью ASP.NET и Visual Basic.NET
306654 Как следует двоичные файлы для обозревателя, с помощью ASP.NET и Visual C#.NET
Для получения дополнительных сведений посетите следующий веб-узел Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-us/library/System.IO.FileStream (vs.71) .aspx

Свойства

Код статьи: 812406 - Последний отзыв: 14 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Web Services Enhancements for Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Ключевые слова: 
kbwebserver kbwebforms kbweb kbdownload kbprb kbmt KB812406 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:812406

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com