Você está offline; aguardando reconexão

Não há suporte para seu navegador

Você precisa atualizar seu navegador para usar o site.

Atualize para a versão mais recente do Internet Explorer

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

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
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):
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.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 812406 - Última Revisão: 11/21/2007 18:22:50 - Revisão: 4.3

  • Microsoft Web Services Enhancements para Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • kbmt kbwebserver kbwebforms kbweb kbdownload kbprb KB812406 KbMtpt
Comentários
s://c1.microsoft.com/c.gif?DI=4050&did=1&t=">TagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> >>ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");