PROBLEMA: Response.WriteFile não consegue transferir um ficheiro grande

Traduções de Artigos Traduções de Artigos
Artigo: 812406 - Ver produtos para os quais este artigo se aplica.
Importante
Os produtos de outros fabricantes que são discutidos neste artigo são fabricados por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, expressa ou implícita, relativamente ao desempenho ou fiabilidade destes produtos.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando tenta utilizar o método Response.WriteFile para transferir um ficheiro grande, poderá não responder a transferência e, em seguida, poderá receber uma das seguintes mensagens de erro:
Não é possível apresentar a página
- ou -
Aplicação de servidor não está disponível

A aplicação da Web que está a tentar aceder neste servidor Web está actualmente indisponível. Seleccione o botão 'Actualizar' no browser para repetir o pedido.

Administrador Nota: Poderá encontrar uma mensagem de erro com detalhes sobre a causa desta falha do pedido específico no registo de eventos do sistema do servidor web. Consulte esta entrada de registo para identificar a causa deste erro.
Também poderá receber a seguinte mensagem no registo de eventos de aplicações:

Aspnet_wp.exe (ou W3wp.exe para aplicações que são executados no Microsoft Internet Information Services IIS 6.0) parou inesperadamente.

Durante este processo, também poderá verificar um aumento de utilização da memória do servidor Web.

Causa

A configuração de hardware do computador de servidor Web determina o tamanho máximo do ficheiro que pode transferir com êxito. Quando o processo de trabalho do ASP.NET (Aspnet_wp.exe ou W3wp.exe para aplicações que são executados no Internet Information Services 6.0 [IIS]) é executado o pedido de transferência de ficheiro, a caixa de diálogo de transferência do ficheiro apresentada. O processo de trabalho do ASP.NET começa a enviar os dados para o processo dos serviços do Microsoft Internet Information (Inetinfo.exe ou Dllhost.exe). -Não aguarda que clique em OK .

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

Como contornar

Para contornar este problema, utilize qualquer um dos seguintes métodos:
  • Obter os dados em pequenas porções e, em seguida, mova os dados na sequência de saída para transferência. O seguinte código demonstra como efectuar este procedimento.

    importante Quando definir o valor do atributo de depuração do elemento compilação como false no ficheiro Web.config da aplicação ASP.NET, tem de definir a propriedade Server.ScriptTimeout para um valor adequado para o tamanho de transferência do ficheiro. Por predefinição, o Server.ScriptTimeout está definido para 90 segundos. No entanto, quando o atributo de depuração está definido como true , o valor de Server.ScriptTimeout será definido para um grande 30,000,000 segundos. Como programador, deve ter em consideração o impacto que esta tenha sobre o comportamento da aplicação Web do ASP.NET.

    Além disso, o código que se segue, tem de estar atento os valores de parâmetro que são utilizados com o construtor FileStream . Os valores de enumeração que estão especificado fazer um impacto significativo na funcionalidade que é fornecida. Para mais informações, consulte a hiperligação FileStream na secçã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 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();
    	}
    	
    substituir DownloadFileName com o nome de um ficheiro que está mais de 100 megabytes (MB).

    - ou -
  • Fornecer uma hiperligação para o utilizador transferir o ficheiro.

    - ou -
  • Utilizar o Microsoft ASP 3.0 para as transferências ou utilizar Software Artisans FileUp com o ASP.

    - ou -
  • Crie uma extensão ISAPI para transferir o ficheiro.

    - ou -
  • Utilize o FTP para transferir o ficheiro.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. No Microsoft Visual Basic .NET ou no Microsoft Visual C#. NET, criar um novo projecto de aplicação Web. Por predefinição, é criado WebForm1.aspx.
  2. Arraste um botão de objecto da caixa ferramenta para WebForm1.aspx.
  3. Faça duplo clique no objecto de botão para abrir o evento clicar na vista de 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 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. Substitua DownloadFileName com o nome de um ficheiro 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 números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
307603 Como escrever ficheiros binários para o browser utilizando o ASP.NET e Visual Basic .NET
306654 Como escrever ficheiros binários para o browser utilizando o ASP.NET e Visual C# .NET
Para mais informações, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/system.io.filestream(vs.71).aspx

Propriedades

Artigo: 812406 - Última revisão: 21 de novembro de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft Web Services Enhancements for 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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