Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

PRB: Response.WriteFile không thể tải một tập tin lớn

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:812406
TRIỆU CHỨNG
Khi bạn cố gắng sử dụng các Response.WriteFile phương pháp để tải xuống một tập tin lớn, tải về có thể đáp ứng, và sau đó, bạn có thể nhận được một trong các thông báo lỗi sau đây:
Trang không thể hiển thị
- hay -
Server Application Không sẵn dùng

Ứng dụng Web bạn đang cố gắng để truy cập vào đây Web server là hiện không có sẵn. Hãy nhấn nút "Làm mới" trong của bạn Trình duyệt web để thử lại yêu cầu của bạn.

Quản trị viên lưu Ý: Một lỗi thông báo chi tiết các nguyên nhân của sự thất bại này yêu cầu cụ thể có thể được tìm thấy trong việc ghi nhật ký sự kiện hệ thống của máy chủ web. Hãy xem lại mục nhập Nhật ký này để khám phá những gì gây ra lỗi này xảy ra.
Bạn cũng có thể nhận các thông báo sau trong sổ ghi sự kiện ứng dụng:

Aspnet_wp.exe (hoặc W3wp.exe cho các ứng dụng chạy trên Microsoft Internet Information Services [II] 6.0) dừng đột ngột.

Trong quá trình này, bạn cũng có thể nhận thấy một tăng sử dụng bộ nhớ của máy chủ Web.
NGUYÊN NHÂN
Cấu hình phần cứng của máy tính máy chủ Web xác định kích thước tệp tối đa mà bạn có thể tải xuống thành công. Khi các ASP.Quá trình công nhân NET (Aspnet_wp.exe hoặc W3wp.exe cho các ứng dụng chạy trên Internet Information Services 6.0 [II])» chạy theo yêu cầu tải về tập tin, tập tin tải về hộp thoại xuất hiện. Các ASP.Quá trình công nhân NET bắt đầu gửi dữ liệu đến Internet của Microsoft Thông tin dịch vụ quá trình (Inetinfo.exe hay Dllhost.exe). Nó không chờ đợi để bạn có thể nhấp vào Ok.

Tùy thuộc vào sự cấu hình của máy tính, quá trình IIS có thể xử lý dữ liệu, hoặc các dữ liệu có thể được buffered trong bộ nhớ. Khi các tập tin lớn, các dữ liệu được buffered trong bộ nhớ trong giao tiếp giữa hai quá trình. Điều này có thể gây ra một tăng trong việc sử dụng bộ nhớ trên hệ phục vụ. Lỗi xảy ra vì giới hạn bộ nhớ trên máy chủ Web.
CÁCH GIẢI QUYẾT KHÁC
Để làm việc xung quanh vấn đề này, hãy sử dụng bất kỳ một trong những điều sau đây phương pháp:
  • Có được các dữ liệu trong phần nhỏ, và sau đó di chuyển dữ liệu để dòng suối đầu ra để tải về. Các mã sau đây chứng tỏ làm thế nào để làm điều Điều này.

    Quan trọng Khi bạn thiết lập giá trị của các gỡ lỗi thuộc tính của nguyên tố tổng hợp để sai trong tập tin Web.config ASP của bạn.Ứng dụng mạng, bạn phải thiết lập các Server.ScriptTimeout bất động sản cho một giá trị thích hợp cho kích thước tải về tập tin. Theo mặc định, các Server.ScriptTimeout giá trị được thiết lập để 90 giây. Tuy nhiên, khi các gỡ lỗi thuộc tính được đặt thành sự thật, các Server.ScriptTimeout giá trị sẽ được đặt rất lớn 30,000,000 giây. Như là một nhà phát triển, bạn phải được nhận thức của các tác động này có thể có trên hành vi của ASP của bạn.NET Web ứng dụng.

    Ngoài ra, trong mã sau bạn phải được nhận thức của các các giá trị tham số được sử dụng với các FileStream nhà xây dựng. Các giá trị đếm rằng đang làm specifed cho một tác động đáng kể về các chức năng mà được cung cấp. Cho thêm thông tin, tham khảo các FileStream liên kết trong cácTÀI LIỆU THAM KHẢO keá tieáp.
    Thị giác Cơ bản.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();	}	
    Thay thế DownloadFileName với tên gọi của một tập tin lớn hơn 100 megabyte (MB).

    - hay -
  • Cung cấp một liên kết cho người dùng để tải xuống các tập tin.

    - hay -
  • Sử dụng Microsoft ASP 3.0 cho các tải hoặc sử dụng phần mềm Nghệ nhân FileUp với ASP.

    - hay -
  • Tạo một phần mở rộng ISAPI để tải về các tập tin.

    - hay -
  • Sử dụng FTP để tải các tập tin.
TÌNH TRẠNG
Điều này hành vi là do thiết kế.
THÔNG TIN THÊM

Các bước để tạo lại hành vi

  1. Trong Microsoft Visual Basic.NET hay trong Microsoft Visual C# .NET, tạo ra một dự án mới ứng dụng Web. Theo mặc định, WebForm1.aspx là tạo ra.
  2. Kéo một đối tượng nút từ hộp công cụ để WebForm1.aspx.
  3. Bấm đúp vào các đối tượng nút để mở các Nhấp vào sự kiện trong Code View.
  4. Dán mã sau đây trong Button1 Nhấp vào sự kiện.

    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. Thay thế DownloadFileName với tên tệp lớn hơn 100 MB.
  6. Trên các Gỡ lỗi trình đơn, nhấp vàoBắt đầu.
  7. Nhấp vào Button1.
THAM KHẢO
Để biết thêm chi tiết, nhấp vào số bài viết sau để xem các bài viết trong cơ sở kiến thức Microsoft:
307603 Làm thế nào để viết tập tin nhị phân để trình duyệt bằng cách sử dụng ASP.NET và Visual Basic.NET
306654 Làm thế nào để viết tập tin nhị phân để trình duyệt bằng cách sử dụng ASP.NET và Visual C#.NET
Để biết thêm chi tiết, ghé thăm Web site sau của Microsoft Developer Network (MSDN):
Chú ý
Các sản phẩm của bên thứ ba được thảo luận trong bài viết này được sản xuất bởi các công ty độc lập của Microsoft. Microsoft đưa ra không có bảo hành, ngụ ý hoặc bằng cách khác, liên quan đến hiệu suất hoặc độ tin cậy của các sản phẩm.

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 812406 - Xem lại Lần cuối: 08/28/2011 08:13:00 - Bản sửa đổi: 2.0

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

  • kbwebserver kbwebforms kbweb kbdownload kbprb kbmt KB812406 KbMtvi
Phản hồi