PRB: Response.WriteFile δεν είναι δυνατό να λάβετε ένα μεγάλο αρχείο

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 812406 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ενημέρωση
The third-party products that are discussed in this article are manufactured by companies that are independent of Microsoft. Η Microsoft δεν παρέχει καμία εγγύηση, σιωπηρή ή άλλη, όσον αφορά τις επιδόσεις ή την αξιοπιστία αυτών των προϊόντων.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Όταν προσπαθείτε να χρησιμοποιήσετε τοResponse.WriteFileμέθοδος για να κάνετε λήψη ενός μεγάλου αρχείου, η λήψη ενδέχεται να μην ανταποκρίνεται, και στη συνέχεια, ενδέχεται να λάβετε ένα από τα ακόλουθα μηνύματα λάθους:
Δεν είναι δυνατή η προβολή της σελίδας
-ή-
Server Application Unavailable

The web application you are attempting to access on this web server is currently unavailable. Please hit the "Refresh" button in your web browser to retry your request.

Διαχειριστής Σημείωση: Ένα μήνυμα σφάλματος που περιγράφουν λεπτομερώς την αιτία αυτής της αποτυχίας συγκεκριμένη αίτηση μπορείτε να βρείτε στο αρχείο καταγραφής συμβάντων συστήματος του διακομιστή web. Διαβάστε αυτήν την καταχώρηση αρχείου καταγραφής για να ανακαλύψετε τι προκάλεσε αυτό το σφάλμα.
Μπορείτε, επίσης, ενδέχεται να λάβετε το ακόλουθο μήνυμα στο αρχείο καταγραφής συμβάντων εφαρμογής:

Aspnet_wp.exe (ή W3wp.exe, για εφαρμογές που εκτελούνται σε Microsoft Internet Information Services [IIS] 6.0) διακοπεί ξαφνικά.

Κατά τη διάρκεια αυτής της διαδικασίας, ενδέχεται επίσης να παρατηρήσετε μια αύξηση της χρήσης της μνήμης του διακομιστή Web.

Αιτία

Η ρύθμιση παραμέτρων υλικού του υπολογιστή διακομιστή Web Καθορίζει το μέγιστο μέγεθος αρχείου που μπορείτε να φορτώσετε με επιτυχία. Όταν η διαδικασία εργασίας ASP.NET (Aspnet_wp.exe ή W3wp.exe για εφαρμογές που εκτελούνται στο Internet Information Services 6.0 [IIS]) της αίτησης λήψης αρχείου, εμφανίζεται το παράθυρο διαλόγου λήψης αρχείων. Ξεκινά η διαδικασία εργασίας ASP.NET για να στείλετε τα δεδομένα της Microsoft Internet Information Services διαδικασίας (Inetinfo.exe ή DLLHost.exe). Δεν αναμένουν για να κάνετε κλικOk.

Ανάλογα με τη ρύθμιση παραμέτρων του υπολογιστή, η διαδικασία IIS μπορεί να επεξεργαστεί τα δεδομένα ή να εγγραφούν σε buffer τα δεδομένα στη μνήμη. Όταν το αρχείο είναι μεγάλο, τα δεδομένα θα αποθηκεύονται προσωρινά στη μνήμη κατά την επικοινωνία ανάμεσα σε αυτές τις δύο διαδικασίες. Αυτό μπορεί να προκαλέσει μια αύξηση με τη χρήση της μνήμης στο διακομιστή. Το σφάλμα παρουσιάζεται εξαιτίας τους περιορισμούς μνήμης στο διακομιστή Web.

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιλύσετε αυτό το ζήτημα, χρησιμοποιήστε οποιαδήποτε από τις ακόλουθες μεθόδους:
  • Αποκτήστε τα δεδομένα σε μικρά τμήματα και στη συνέχεια μετακινήστε τα δεδομένα στη ροή εξόδου για λήψη. Ο ακόλουθος κώδικας περιγράφει τον τρόπο πραγματοποίησης αυτού.

    ΣημαντικόΌταν ορίζετε την τιμή τηςο εντοπισμός σφαλμάτωνχαρακτηριστικό του στοιχείου μεταγλώττισης γιαFALSEστο αρχείο Web.config της εφαρμογής ASP.NET σας, πρέπει να ορίσετε τοServer.ScriptTimeoutη ιδιότητα με την κατάλληλη τιμή για το μέγεθος λήψης αρχείων. Από προεπιλογή, τοServer.ScriptTimeoutvalue is set to 90 seconds. However, when theο εντοπισμός σφαλμάτωντο χαρακτηριστικό έχει οριστεί σεTrueΓια ναServer.ScriptTimeoutvalue will be set to a very large 30,000,000 seconds. As a developer, you must be aware of the impact that this may have on the behavior of your ASP.NET Web application.

    Also, in the code that follows you must be aware of the parameter values that are used with theFileStreamconstructor. The enumeration values that are specifed make a significant impact on the functionality that is provided. For more information, refer to theFileStreamlink in theΑναφορέςΕνότητα.
    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 κώδικα
    	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();
    	}
    	
    Αντικαταστήστε το τμήμαDownloadFileNamewith the name of a file that is larger than 100 megabytes (MB).

    -ή-
  • Provide a link for the user to download the file.

    -ή-
  • Use Microsoft ASP 3.0 for the downloads or use Software Artisans FileUp with ASP.

    -ή-
  • Create an ISAPI extension to download the file.

    -ή-
  • Use FTP to download the file.

Κατάσταση

Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.

Περισσότερες πληροφορίες

Βήματα για την αναπαραγωγή της συμπεριφοράς

  1. In Microsoft Visual Basic .NET or in Microsoft Visual C# .NET, create a new Web Application project. By default, WebForm1.aspx is created.
  2. Σύρετε έναbutton objectfrom the tool box to WebForm1.aspx.
  3. Κάντε διπλό κλικ στο φάκελοbutton objectΓια να ανοίξετε τοΚάντε κλικevent in Code View.
  4. Paste the following code in the Button1Κάντε κλικΣυμβάν.

    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)

    Το 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. Αντικαταστήστε το τμήμαDownloadFileNamewith the name of a file that is larger than 100 MB.
  6. Στο διακομιστήΟ εντοπισμός σφαλμάτωνμενού, κάντε κλικ στο κουμπίStart.
  7. Κάντε κλικButton1.

Αναφορές

Για περισσότερες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω για να προβάλετε τα άρθρα της Γνωσιακής Βάσης (Knowledge Base) της Microsoft:
307603How to write binary files to the browser using ASP.NET and Visual Basic .NET
306654How to write binary files to the browser using ASP.NET and Visual C# .NET
Για περισσότερες πληροφορίες, επισκεφθείτε την ακόλουθη τοποθεσία του Microsoft Developer Network (MSDN) στο Web:
http://msdn2.microsoft.com/en-us/library/system.io.filestream(vs.71).aspx

Ιδιότητες

Αναγν. άρθρου: 812406 - Τελευταία αναθεώρηση: Τετάρτη, 22 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Web Services Enhancements για Microsoft .NET 1.1
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Λέξεις-κλειδιά: 
kbwebserver kbwebforms kbweb kbdownload kbprb kbmt KB812406 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:812406

Αποστολή σχολίων

 

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