PRB: Response.WriteFile Impossibile scaricare un file di grandi dimensioni

Traduzione articoli Traduzione articoli
Identificativo articolo: 812406 - Visualizza i prodotti a cui si riferisce l?articolo.
Avviso
I prodotti di terze parti citati in questo articolo sono forniti da produttori indipendenti. Microsoft non rilascia alcuna garanzia, implicita o di altra natura, relativa alle prestazioni o all'affidabilitÓ di questi prodotti.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si tenta di utilizzare il metodo Response.WriteFile per scaricare un file di grandi dimensioni, il download potrebbe non rispondere e quindi Ŕ possibile che venga visualizzato uno dei seguenti messaggi di errore:
Impossibile visualizzare la pagina
- oppure -
Applicazione server non disponibile

L'applicazione Web che si sta tentando di accedere sul server Web si trova attualmente non disponibile. Fare clic sul pulsante "Aggiorna" nel browser Web per ripetere la richiesta.

Nota per l'amministratore: Un messaggio di errore dettagli la causa dell'errore richiesta specifica Ŕ reperibile nel registro eventi sistema del server web. Vedere la voce corrispondente del registro per scoprire la causa questo errore si verifica.
╚ possibile ricevere il seguente messaggio nel registro eventi applicazioni:

Aspnet_wp.exe (o w3wp.exe per applicazioni eseguite su Microsoft Internet Information Services [IIS] 6.0) arrestato in modo imprevisto.

Durante questo processo, Ŕ inoltre possibile notare un aumento dell'utilizzo della memoria del server Web.

Cause

La configurazione hardware del computer server Web determina la dimensione di file massima che Ŕ possibile scaricare correttamente. Quando il processo di lavoro di ASP.NET (Aspnet_wp.exe o w3wp.exe per le applicazioni eseguite in Internet Information Services 6.0 [IIS]) viene eseguita la richiesta di download di file, viene visualizzata la finestra di dialogo download file. Il processo di lavoro ASP.NET inizia a inviare i dati a Microsoft Internet Information Services processo (Inetinfo.exe o Dllhost.exe). Esso non attenderÓ per poter fare clic su OK .

A seconda della configurazione del computer, il processo di IIS pu˛ elaborare i dati oppure i dati possono essere memorizzati nel buffer. Quando il file Ŕ grande, i dati sono memorizzati in memoria durante la comunicazione tra i due processi. Ci˛ potrebbe causare un aumento nell'utilizzo di memoria sul server. L'errore si verifica a causa dei vincoli memoria sul server Web.

Workaround

Per ovviare al problema, utilizzare uno dei metodi descritti di seguito:
  • Ottenere i dati in parti di piccole dimensioni e quindi spostare i dati nel flusso di output per il download. Il codice riportato di seguito viene illustrato come eseguire questa operazione.

    importante Quando si imposta il valore dell'attributo dell'elemento compilation debug su false nel file Web.config dell'applicazione ASP.NET, Ŕ necessario impostare la proprietÓ server.ScriptTimeout su un valore per la dimensione del download di file appropriato. Per impostazione predefinita, il valore di server.ScriptTimeout Ŕ impostato su finestra di 90 secondi. Tuttavia, quando l'attributo debug Ŕ impostata su true , il server.ScriptTimeout valore verrÓ impostato per un grandi 30,000,000 secondi. Lo sviluppatore di Ŕ necessario essere consapevoli dell'impatto di tale sul comportamento dell'applicazione Web ASP.NET.

    Inoltre, il codice che segue Ŕ necessario tenere in considerazione i valori di parametro che vengono utilizzati con il costruttore di FileStream . I valori di enumerazione specificato rendono la funzionalitÓ che viene fornita un impatto significativo. Per ulteriori informazioni, fare riferimento al collegamento di FileStream nella sezione REFERENCES.
    codice 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
    
    Codice di 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();
    	}
    	
    sostituire DownloadFileName con il nome di un file di dimensioni superiore a 100 megabyte (MB).

    - oppure -
  • Fornire un collegamento l'utente pu˛ scaricare il file.

    - oppure -
  • Utilizzare Microsoft ASP 3.0 per il download oppure Software FileUp Artisans con ASP.

    - oppure -
  • Creare un'estensione ISAPI per scaricare il file.

    - oppure -
  • Utilizzare FTP per scaricare il file.

Status

Questo comportamento legato alla progettazione.

Informazioni

Procedura per riprodurre il problema.

  1. In Microsoft Visual Basic .NET o in Microsoft Visual C#. NET, creare un nuovo progetto applicazione Web. Per impostazione predefinita, viene creato WebForm1.aspx.
  2. Trascinare un oggetto pulsante dalla casella di strumenti a WebForm1.aspx.
  3. Fare doppio clic sull' oggetto pulsante per aprire l'evento Click in visualizzazione codice.
  4. Incollare il codice seguente nell'evento Button1 Click .

    codice 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)

    codice di 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. Sostituire DownloadFileName con il nome di un file che Ŕ maggiore di 100 MB.
  6. Nel menu debug , fare clic su Start .
  7. Fare clic su Button1 .

Riferimenti

Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportato di seguito:
307603 Come scrivere i file binari nel browser utilizzando ASP.NET e Visual Basic .NET
306654 Come scrivere i file binari nel browser utilizzando ASP.NET e Visual C# .NET
Per ulteriori informazioni, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
http://msdn2.microsoft.com/en-us/library/system.io.filestream(vs.71).aspx

ProprietÓ

Identificativo articolo: 812406 - Ultima modifica: mercoledý 21 novembre 2007 - Revisione: 4.3
Le informazioni in questo articolo si applicano a:
  • Microsoft Web Services Enhancements per Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Chiavi:á
kbmt kbwebserver kbwebforms kbweb kbdownload kbprb KB812406 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 812406
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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