Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
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.
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.
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.
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.
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.
Arraste um botão de objecto da caixa ferramenta para WebForm1.aspx.
Faça duplo clique no objecto de botão para abrir o evento clicar na vista de código.
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);
Substitua DownloadFileName com o nome de um ficheiro que é maior do que 100 MB.
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
(http://support.microsoft.com/kb/812406/en-us/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
O que podemos fazer para melhor estas informações?
Para proteger a sua privacidade, não inclua as informações de contacto nos comentários.
Obrigado! Os seus comentários serão utilizados para nos ajudar a melhorar o conteúdo do suporte. Para obter mais opções de assistência, visite a Home Page da Ajuda e Suporte.