PROBLEMA: Response.WriteFile não é possível baixar um arquivo grande

Traduções deste artigo Traduções deste artigo
ID do artigo: 812406 - Exibir os produtos aos quais esse artigo se aplica.
Aviso
Os produtos de terceiros descritos neste artigo são fabricados por empresas que são independentes da Microsoft. A Microsoft não oferece garantia, implícita ou não, em relação ao desempenho ou à confiabilidade desses produtos.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Ao tentar usar o método Response.WriteFile para baixar um arquivo grande, o download não pode responder e, em seguida, você pode receber uma das seguintes mensagens de erro:
A página não pode ser exibida
- ou -
Aplicativo de servidor não disponível

O aplicativo Web que você está tentando acessar neste servidor Web é indisponível no momento. Clique no botão "Atualizar" no navegador da Web para repetir a solicitação.

Observação do administrador: Uma mensagem de erro detalhando a causa dessa falha de solicitação específica pode ser encontrada no log de eventos do sistema do servidor web. Examine essa entrada de log para descobrir o que causou o erro ocorrer.
Também poderá receber a seguinte mensagem no log de eventos do aplicativo:

Aspnet_wp.exe (ou W3wp.exe, para aplicativos que são executados no Microsoft IIS [] 6.0) interrompido inesperadamente.

Durante esse processo, você também pode perceber um aumento na utilização de memória do servidor Web.

Causa

A configuração de hardware do computador do servidor Web determina o tamanho máximo do arquivo que você pode baixar com êxito. Quando o processo do operador do ASP.NET (Aspnet_wp.exe ou W3wp.exe para aplicativos que são executados no Internet Information Services 6.0 [IIS]) executa a solicitação de download de arquivo, a caixa de diálogo de download de arquivo será exibida. O processo do operador do ASP.NET começa a enviar os dados para o processo do Microsoft Internet Information Services (Inetinfo.exe ou Dllhost.exe). Ele não espera para que você clique em OK .

Dependendo da configuração do computador, o processo do IIS pode processar os dados ou os dados podem ser armazenado em buffer na memória. Quando o arquivo é grande, os dados é armazenado em buffer na memória durante a comunicação entre esses dois processos. Isso pode causar um aumento na utilização de memória no servidor. O erro ocorre devido as restrições de memória no servidor Web.

Como Contornar

Para contornar esse problema, use qualquer um dos seguintes métodos:
  • Obter os dados em pequenas partes e mova os dados no fluxo de saída para download. O código a seguir demonstra como fazer isso.

    importante Quando você define o valor do atributo debug do elemento compilation para false no arquivo Web.config do seu aplicativo ASP.NET, você deve definir a propriedade Server.ScriptTimeout para um valor apropriado para o tamanho do arquivo de download. Por padrão, o valor Server.ScriptTimeout é definido como 90 segundos. No entanto, quando o atributo debug é definido como true , o Server.ScriptTimeout valor será definido para um grande 30,000,000 segundos. Como desenvolvedor, você deve estar ciente do impacto que isso pode ter o comportamento do seu aplicativo ASP.NET.

    Além disso, no código a segue você deve estar ciente dos valores de parâmetro que são usados com do construtor FileStream . Os valores de enumeração que forem especificados faça um impacto significativo na funcionalidade fornecida. Para obter mais informações, consulte o link de FileStream na seção REFERENCES.
    código do Visual Basic .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
    
    Código do .NET translation from VPE for Csharp visual
    	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();
    	}
    	
    substituir DownloadFileName com o nome de um arquivo que está maior do que 100 megabytes (MB).

    - ou -
  • Forneça um link para o usuário baixe o arquivo.

    - ou -
  • Use Microsoft ASP 3.0 para os downloads ou use Software Artisans FileUp com o ASP.

    - ou -
  • Crie uma extensão ISAPI para baixar o arquivo.

    - ou -
  • Use o FTP para baixar o arquivo.

Situação

Esse comportamento é por design.

Mais Informações

Passos para reproduzir o problema

  1. No Microsoft Visual Basic .NET ou no Microsoft Visual translation from VPE for Csharp. NET, criar um novo projeto Web Application. Por padrão, WebForm1.aspx é criado.
  2. Arraste um objeto de botão da caixa de ferramentas a WebForm1.aspx.
  3. Clique duas vezes o objeto de botão para abrir o evento Click no modo de exibição código.
  4. Cole o seguinte código no evento Button1 clique .

    código do 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)

    código do .NET translation from VPE for Csharp Visual
    	// 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. Substitua DownloadFileName pelo nome de um arquivo que é maior do que 100 MB.
  6. No menu Debug , clique em Iniciar .
  7. Clique em Button1 .

Referências

Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
307603 Como gravar arquivos binários para o navegador usando ASP.NET e Visual Basic .NET
306654 Como gravar arquivos binários para o navegador usando ASP.NET e Visual translation from VPE for Csharp .NET
Para obter mais informações, visite o seguinte site da Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/system.io.filestream(vs.71).aspx

Propriedades

ID do artigo: 812406 - Última revisão: quarta-feira, 21 de novembro de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft Web Services Enhancements para Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Palavras-chave: 
kbmt kbwebserver kbwebforms kbweb kbdownload kbprb KB812406 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 812406

Submeter comentários

 

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