PRB: Response.WriteFile kann keine große Datei downloaden

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 812406 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Hinweis
Die Produkte von Drittanbietern, die in diesem Artikel behandelt werden, sind von Unternehmen hergestellt, die von Microsoft unabhängig sind. Microsoft gewährt keine implizite oder sonstige Garantie in Bezug auf die Leistung oder Zuverlässigkeit dieser Produkte.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie versuchen, die Methode Response.WriteFile verwenden, um eine große Datei zu downloaden, Download reagiert möglicherweise nicht und wird möglicherweise eine der folgenden Fehlermeldungen angezeigt:
Die Seite kann nicht angezeigt werden
-oder-
Die Serveranwendung ist nicht verfügbar

Die Webanwendung auf diesem Webserver ist derzeit nicht verfügbar. Klicken Sie auf "Aktualisieren" im Webbrowser, um den Vorgang zu wiederholen.

Administrator-Hinweis: Eine Fehlermeldung in die Ursache dieses Anforderungsfehlers näher erläutert können in das Systemereignisprotokoll des Webservers gefunden werden. Überprüfen Sie diesen Protokolleintrag Ursachen für diesen Fehler.
Im Ereignisprotokoll Anwendung möglicherweise auch die folgende Meldung angezeigt:

Aspnet_wp.exe (oder w3wp.exe für Anwendungen, die auf Microsoft Internet Information Services [IIS] 6.0 ausgeführt werden) wurde unerwartet beendet.

Während dieses Vorgangs können Sie auch einen Anstieg der Speicher Nutzung von dem Webserver bemerken.

Ursache

Die Hardwarekonfiguration des Webserver-Computer wird die maximale Größe, die Sie, erfolgreich downloaden können bestimmt. Wenn der ASP.NET-Workerprozess (aspnet_wp.exe oder w3wp.exe für Anwendungen, die auf Internet Information Services 6.0 [IIS] ausgeführt) die Datei Downloadanforderung ausgeführt wird, wird das Dialogfeld Download-Datei angezeigt. Der ASP.NET-Arbeitsprozess wird die Daten an den Microsoft Internet Information Services Prozess (Inetinfo.exe oder Dllhost.exe) senden. Er wartet nicht auf Sie auf OK klicken zurückzukehren.

Je nach der Konfiguration des Computers der IIS-Prozess kann die Daten verarbeiten oder die Daten im Arbeitsspeicher gepuffert werden können. Wenn die Datei groß ist, werden die Daten während der Kommunikation zwischen diesen beiden Prozessen im Speicher gepuffert. Dies kann einen Anstieg in der Speicherauslastung auf dem Server führen. Der Fehler tritt aufgrund von Speicherbeschränkungen auf dem Server.

Abhilfe

Um zu diesem Problem zu umgehen, verwenden Sie eine der folgenden Methoden:
  • Rufen Sie die Daten in kleine Teile, und verschieben Sie die Daten in den Ausgabestream für den Download. Der folgende Code veranschaulicht, wie dies tun.

    wichtig Wenn Sie den Wert des Attributs debug des Elements Kompilierung in der Datei Web.config der ASP.NET-Anwendung auf false festlegen, müssen Sie einen geeigneten Wert für die Datei-Download-Größe die Eigenschaft Server.ScriptTimeout festlegen. Standardmäßig wird der Wert Server.ScriptTimeout auf 90 Sekunden festgelegt. Jedoch, wenn das debug -Attribut auf true festgelegt ist, wird der Server.ScriptTimeout Wert zu einer sehr großen 30,000,000 Sekunden festgelegt. Als Entwickler müssen Sie die Auswirkungen bewusst sein, die dies möglicherweise auf das Verhalten Ihrer ASP.NET-Webanwendung.

    Außerdem muss im Code, der Sie folgt die Werte der Parameter bekannt sein, die mit der FileStream -Konstruktor verwendet werden. Enumerationswerte, die angegeben werden stellen einen erheblichen Einfluss auf die Funktionalität, die bereitgestellt wird. Weitere Informationen finden Sie auf die FileStream -Verknüpfung im Abschnitt REFERENCES.
    Visual Basic .NET Code
          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
    
    Visual c# .NET Code
    	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();
    	}
    	
    ersetzen DownloadFileName mit dem Namen einer Datei, größer als 100 Megabyte (MB).

    -oder-
  • Stellen Sie eine Verbindung für den Benutzer die Datei herunterzuladen.

    -oder-
  • Verwenden Sie Microsoft ASP 3.0 für die Downloads oder Software Artisans FileUp mit ASP.

    -oder-
  • Erstellen Sie eine ISAPI-Erweiterung, die Datei zu downloaden.

    -oder-
  • Verwenden Sie FTP, um die Datei zu downloaden.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. In Microsoft Visual Basic .NET oder in Microsoft Visual c# .NET erstellen Sie ein neues Webanwendungsprojekt. Standardmäßig wird "WebForm1.aspx" erstellt.
  2. Ziehen Sie ein Button-Objekt aus der Toolbox auf WebForm1.aspx.
  3. Doppelklicken Sie auf das Button-Objekt , um das Click -Ereignis in der Codeansicht zu öffnen.
  4. Fügen Sie folgenden Code in das Button1 Click -Ereignis.

    Visual Basic .NET Code
    	' 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)

    Visual c# .NET Code
    	// 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. Ersetzen Sie DownloadFileName, durch den Namen einer Datei, die größer ist als 100 MB.
  6. Klicken Sie im Menü Debuggen auf Starten .
  7. Klicken Sie auf Button1 .

Informationsquellen

Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
307603 Wie Sie binäre Dateien an den Browser mit ASP.NET und Visual Basic .NET schreiben
306654 Das Schreiben von Binärdateien an den Browser mit ASP.NET und Visual c# .NET
Weitere Informationen der folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn2.microsoft.com/en-us/library/system.io.filestream(vs.71).aspx

Eigenschaften

Artikel-ID: 812406 - Geändert am: Mittwoch, 21. November 2007 - Version: 4.3
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Web Services Enhancements for Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Keywords: 
kbmt kbwebserver kbwebforms kbweb kbdownload kbprb KB812406 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 812406
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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