PRB: Response.WriteFile nelze stáhnout velké soubory

Příznaky

Při pokusu o stažení velký soubor pomocí metody Response.WriteFile nemusí správně reagovat download a pak může zobrazit jedna z následujících chybových zpráv:
Stránku nelze zobrazit.
- nebo -
Serverová aplikace není k dispozici

Webová aplikace, kterou se pokoušíte získat přístup na tento webový server není nyní dostupný. Klepněte na tlačítko "Aktualizovat" ve webovém prohlížeči opakovat váš požadavek.

Poznámka pro správce: 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 tento záznam protokolu, chcete-li zjistit, proč k této chybě došlo.
V protokolu událostí aplikace také může zobrazit následující zpráva: během tohoto procesu můžete také zaznamenat nárůst využití paměti na webovém serveru.

Příčina

Hardwarové konfigurace počítače webového serveru určuje maximální velikost souboru, můžete úspěšně stáhnout. Při spuštění pracovního procesu ASP.NET (Aspnet_wp.exe nebo W3wp.exe pro aplikace spuštěné v Internetová informační služba 6.0 [IIS]) požadavek na stažení souboru se zobrazí dialogové okno Stažení souboru. Pracovní proces ASP.NET spustí odeslat data k Internetová informační služba procesu (Inetinfo.exe nebo Dllhost.exe). Nečeká se můžete klepnutím na tlačítko OK.

V závislosti na konfiguraci počítače proces služby IIS může zpracovávat data nebo data může být ukládán do vyrovnávací 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í využití paměti na serveru. Z důvodu omezení paměti na webovém serveru dojde k chybě.

Jak potíže obejít

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

    Důležité: Pokud nastavíte hodnotu debug atribut kompilace prvku false v souboru Web.config vaší aplikace technologie 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 ladění atribut je nastavena na true, hodnota Server.ScriptTimeout nastaví se velmi rozsáhlých 30,000,000 sekund. Jako vývojář musíte být vědomi dopadu, který to může mít na chování ASP.NET webové aplikace.

    V kódu, který vás sleduje musí být vědomi hodnoty parametrů, které jsou používány s FileStream konstruktoru. Výčet hodnot, které jsou určený provést významný dopad na funkčnost, která je k dispozici. Další informace naleznete v odkazu FileStream v
    Sekce odkazy .
    Kód jazyka 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

    Kód jazyka 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();
    }

    DownloadFileName nahraďte název souboru, který je větší než 100 megabajtů (MB).

    - nebo -
  • Poskytnout odkaz pro uživatele ke stažení souboru.

    - nebo -
  • Použijte soubory ke stažení Microsoft ASP 3.0 nebo Software Artisans FileUp pomocí prostředí ASP.

    - nebo -
  • Vytvořte rozšíření ISAPI ke stažení souboru.

    - nebo -
  • Chcete-li stáhnout soubor pomocí FTP.

Stav

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

Další informace

Kroky pro reprodukci chování

  1. V aplikaci Microsoft Visual Basic .NET nebo Microsoft Visual C# .NET vytvoření nového projektu webové aplikace. 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 klepněte na tlačítko otevřít v zobrazení kódu.
  4. Vložte následující kód v události Button1, klepněte na tlačítko .

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

    Kód jazyka 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. DownloadFileName nahraďte název souboru, který je větší než 100 MB.
  6. V nabídce Debug klepněte na tlačítko
    Spustit.
  7. Klepněte na tlačítko Button1.

Odkazy

Další informace získáte v následujícím článku 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 následujícím webu Microsoft Developer Network (MSDN):
Produkty třetích stran popisované v tomto článku jsou vyráběny společnostmi nezávislými na společnosti Microsoft. Společnost Microsoft neposkytuje žádnou záruku, implicitně předpokládanou ani jinou, ohledně výkonu nebo spolehlivosti těchto produktů.
Vlastnosti

ID článku: 812406 - Poslední kontrola: 17. 2. 2017 - Revize: 2

Váš názor