Teď jste offline a čekáte, až se znova připojí internet.

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

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
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):
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ů.

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 812406 - Poslední kontrola: 11/21/2007 18:22:50 - Revize: 4.3

Microsoft Web Services Enhancements for Microsoft .NET 1.1, Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbmt kbwebserver kbwebforms kbweb kbdownload kbprb KB812406 KbMtcs
Váš názor
html>style="display:none;" onerror="var m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">