PRB: Response.WriteFile nelze stáhnout velký soubor

Překlady článku Překlady článku
ID článku: 812406 - Produkty, které se vztahují k tomuto článku.
Poznámka
Produkty jiných výrobců popisované v tomto článku vyrábějí společnosti, které jsou nezávislé na společnosti Microsoft. Společnost Microsoft neposkytuje žádnou záruku (implicitně předpokládanou ani jinou) týkající se výkonu a spolehlivosti těchto produktů.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při pokusu o stažení velký soubor pomocí metody Response.WriteFile nemusí odpovídat stahování a potom můžete obdržet jednu z následujících chybových zpráv:
Stránku nelze zobrazit
Nebo
Serverová aplikace není k dispozici

Webová aplikace pokusu o přístup na webový server není aktuálně k dispozici. Prosím přístupů "Aktualizace" tlačítko ve webovém prohlížeči opakovat váš požadavek.

Správce Poznámka: Chybová zpráva podrobně popisující příčinu selhání této konkrétní požadavek lze nalézt v protokolu systémových událostí serveru WWW. Zkontrolujte tato položka protokolu zjistit, co způsobilo této chybě dojít.
V protokolu událostí aplikace může také zobrazit následující zpráva:

Aspnet_wp.exe (nebo W3wp.exe pro spuštění Internetová informační služba [IIS] 6.0 aplikace) byl neočekávaně ukončen.

Během tohoto procesu můžete také zaznamenat nárůst využití paměti serveru.

Příčina

Konfigurace hardwaru počítač webového serveru určuje maximální velikost souboru, který lze úspěšně stáhnout. Při spuštění pracovního procesu ASP.NET (Aspnet_wp.exe nebo W3wp.exe aplikací spustit Internetová informační služba 6.0 [IIS]) požadavek stažení souboru, zobrazí se dialogové okno Stažení souboru. Pracovní proces ASP.NET spustí odeslat data ke zpracování Internetová informační služba (Inetinfo.exe nebo Dllhost.exe). Jej nečeká, klepněte na tlačítko OK.

V závislosti na konfiguraci počítače může proces IIS zpracování dat nebo vyrovnávací data může být paměti v paměti. Když je velký soubor, data je ukládán do vyrovnávací paměti v paměti během komunikace mezi těmito dvěma procesy. To může způsobit zvýšení v využití paměti na serveru. Došlo k chybě dochází z důvodu omezení paměti na webovém serveru.

Jak potíže obejít

Tento problém vyřešit, použijte jednu z následujících metod:
  • Získání dat v malé částí a přesuňte data do výstupního proudu stahování. Následující kód ukazuje, jak to provést.

    Důležité: Pokud nastavíte hodnotu atributu ladění prvku kompilace False v souboru web.config aplikace ASP.NET, musíte nastavit vlastnost Server.ScriptTimeout příslušnou hodnotu pro velikost souboru ke stažení. Ve výchozím nastavení je hodnota Server.ScriptTimeout nastavena 90 sekund. Však při atribut ladění je nastavena na hodnotu true, hodnota Server.ScriptTimeout nastavena na velmi velké 30,000,000 sekund. Jako vývojář musí být vědoma dopad to může mít na chování ASP.NET webové aplikace.

    Také v kódu, která následuje, musí být vědoma hodnoty parametrů, které jsou používány s FileStream konstruktor. Výčet hodnot, které jsou určený proveďte značný vliv na funkce, která je k dispozici. Další informace naleznete v tématu FileStream odkaz v části REFERENCES.
    Kód jazyka .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
    
    Visual C# .NET kód
    	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();
    	}
    	
    Nahradit DownloadFileName název souboru je větší než 100 megabajtů (MB).

    Nebo
  • Poskytnout odkaz pro stažení souboru uživatele.

    Nebo
  • Použít Microsoft ASP 3.0 stahování nebo Software FileUp Artisans s ASP.

    Nebo
  • Vytvořit rozšíření ISAPI ke stažení souboru.

    Nebo
  • Stáhnout soubor použít FTP.

Prohlášení

Toto chování je záměrné.

Další informace

Kroky pro reprodukci tohoto chování

  1. V aplikaci Microsoft Visual Basic .NET nebo v Microsoft Visual C# .NET, vytvoření nového projektu webovou aplikaci. Ve výchozím nastavení je vytvořen WebForm1.aspx.
  2. Přetáhněte tlačítko objekt ze seznamu nástroj WebForm1.aspx.
  3. Poklepejte na tlačítko objektu události Click otevřete v zobrazení kódu.
  4. Vložte následující kód v události Button1 klepnutí.

    Kód jazyka .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)

    Visual C# .NET kód
    	// 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. DownloadFileName nahraďte název souboru je větší než 100 MB.
  6. V nabídce Debug klepněte na tlačítko Start.
  7. Klepněte na tlačítko Button1.

Odkazy

Další informace naleznete v následujících článcích znalostní báze Microsoft Knowledge Base:
307603 Jak psát binární soubory prohlížeči pomocí ASP.NET a Visual Basic .NET
306654 Jak psát binární soubory prohlížeči pomocí ASP.NET a Visual C# .NET
Další informace naleznete na následujících webech služby MSDN (Microsoft Developer Network):
http://msdn2.microsoft.com/en-us/library/system.io.filestream(vs.71).aspx

Vlastnosti

ID článku: 812406 - Poslední aktualizace: 21. listopadu 2007 - Revize: 4.3
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Web Services Enhancements for Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Klíčová slova: 
kbmt kbwebserver kbwebforms kbweb kbdownload kbprb KB812406 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:812406

Dejte nám zpětnou vazbu

 

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