PROBLÈME : Response.WriteFile ne peut pas télécharger de fichier volumineux

Traductions disponibles Traductions disponibles
Numéro d'article: 812406 - Voir les produits auxquels s'applique cet article
Avertissement
Les produits tiers mentionnés dans le présent article proviennent de fournisseurs indépendants de Microsoft ; Microsoft exclut toute garantie, implicite ou autre, concernant les performances ou la fiabilité de ces produits.
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous essayez d'utiliser la méthode Response.WriteFile pour télécharger un fichier volumineux, le téléchargement ne répond pas, puis, vous recevez l'un des messages d'erreur suivants :
Impossible d'afficher la page.
- ou -
Application serveur non disponible

L'application Web à laquelle vous tentez d'accéder sur ce serveur Web n'est pas disponible actuellement. Cliquez sur le bouton « Actualiser » de votre navigateur Web pour renouveler la demande.

Remarque pour l'administrateur : Un message d'erreur détaillant la cause de l'échec de cette demande spécifique se trouve dans le journal des événements système du serveur Web. Consultez cette entrée de journal pour savoir ce qui a provoqué cette erreur.
Le message suivant peut également être consigné dans le journal d'événements d'applications :

Aspnet_wp.exe (ou W3wp.exe, pour les applications qui s'exécutent sur les services Internet IIS 6.0) s'est arrêté de façon inattendue.

Pendant ce processus, vous pouvez remarquer également une augmentation de l'utilisation de mémoire du serveur Web.

Cause

La configuration matérielle du serveur Web détermine la taille de fichier maximale que vous pouvez télécharger avec succès. Lorsque le processus de travail ASP.NET (Aspnet_wp.exe, ou W3wp.exe pour les applications qui s'exécutent sur les services IIS 6.0) exécute la demande du téléchargement du fichier, la boîte de dialogue du téléchargement du fichier apparaît. Le processus de travail ASP.NET commence à envoyer les données au processus IIS (Inetinfo.exe ou Dllhost.exe). Il n'attend pas que vous cliquiez sur OK.

Selon la configuration de l'ordinateur, le processus IIS peut traiter les données ou les données peuvent être mises en mémoire tampon. Lorsque le fichier est volumineux, les données sont mises en mémoire tampon pendant la communication entre ces deux processus. Cela peut provoquer une augmentation de l'utilisation de mémoire sur le serveur. L'erreur se produit en raison des contraintes mémoire sur le serveur Web.

Contournement

Pour contourner ce problème, appliquez l'une des méthodes suivantes :
  • Procurez-vous les données en petits volumes, puis déplacez les données vers le flux de sortie en vue du téléchargement. Le code suivant montre la procédure à suivre.

    Important Lorsque vous définissez la valeur de l'attribut debug de l'élément de compilation par false dans le fichier Web.config de votre application ASP.NET, vous devez définir la propriété Server.ScriptTimeout par une valeur appropriée à la taille du fichier téléchargé. Par défaut, la valeur de Server.ScriptTimeout est de 90 secondes. Toutefois, lorsque l'attribut debug est défini par true, la propriété Server.ScriptTimeout sera définie par une valeur très élevée de 30 000 000 secondes. En tant que développeur, vous devez être conscient de l'impact que cela peut avoir sur le comportement de votre application Web ASP.NET.

    En outre, dans le code qui suit, vous devez connaître les valeurs de paramètre qui sont utilisées avec le constructeur FileStream. Les valeurs d'énumération qui sont spécifiées ont un impact significatif sur les fonctionnalités fournies. Pour plus d'informations, consultez le lien FileStream dans la section RÉFÉRENCES.
    Code 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
          End Try
    
    Code 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();
    		}
    	}
    	
    Remplacez DownloadFileName par le nom d'un fichier supérieur à 100 mégaoctets (Mo).

    - ou -
  • Fournissez un lien permettant à l'utilisateur de charger le fichier.

    - ou -
  • Utilisez Microsoft ASP 3.0 pour les téléchargements ou Software Artisans FileUp avec ASP.

    - ou -
  • Créez une extension ISAPI pour télécharger le fichier.

    - ou -
  • Utilisez FTP pour télécharger le fichier.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Procédure pour reproduire le problème

  1. Dans Microsoft Visual Basic .NET ou Microsoft Visual C# .NET, créez un nouveau projet d'application Web. Par défaut, c'est WebForm1.aspx qui est créé.
  2. Faites glisser un objet bouton de la boîte à outils vers WebForm1.aspx.
  3. Double-cliquez sur l'objet bouton pour afficher l'événement Click en Mode Code.
  4. Collez le code suivant dans l'événement Click Button1.

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

    Code 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. Remplacer DownloadFileName par le nom d'un fichier supérieur à 100 Mo.
  6. Dans le menu Déboguer, cliquez sur Démarrer.
  7. Cliquez sur Button1.

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft.
307603 Comment faire pour écrire des fichiers binaires dans le navigateur à l'aide de ASP.NET et Visual Basic .NET
306654 Comment faire pour écrire des fichiers binaires dans le navigateur à l'aide de ASP.NET et Visual C# .NET
Pour plus d'informations, reportez-vous au site Web MSDN (Microsoft Developer Network) à l'adresse suivante (en anglais) :
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemIOFileStreamClassTopic.asp?frame=true

Propriétés

Numéro d'article: 812406 - Dernière mise à jour: lundi 12 février 2007 - Version: 3.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Web Services Enhancements for Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Mots-clés : 
kbwebserver kbwebforms kbweb kbdownload kbprb KB812406
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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