當您嘗試使用 response
writefile 方法下載大文件時
下載操作可能沒有響應
並且隨後可能會收到以下錯誤信息之一
The page cannot be displayed
或
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
Administrator Note:An error message detailing the cause of this specific request failure can be found in the system event log of the web server
Please review this log entry to discover what caused this error to occur
您還可能會在應用程序事件日志中看到以下消息
Aspnet_wpexe(對於在 Microsoft Internet 信息服務 [IIS] 上運行的應用程序則為 Wwpexe)意外停止
在此過程中
您還可能會發現 Web 服務器的內存使用量增加
回到頂端
原因
Web 服務器計算機的硬件配置決定您可以成功下載的最大文件大小
當 ASP
NET 輔助進程(Aspnet_wp
exe
對於在 Internet 信息服務
[IIS] 上運行的應用程序
則為 W
wp
exe)執行文件下載請求時
會出現文件下載對話框
ASP
NET 輔助進程開始向 Microsoft Internet 信息服務進程(Inetinfo
exe 或 Dllhost
exe)發送數據
它不等您單擊
確定
即開始發送
根據計算機的配置
IIS 進程可能會處理數據
也可能會將數據緩存在內存中
如果文件太大
在這兩個進程相互通信的過程中
數據將被緩存在內存中
這可能會導致服務器上的內存使用量增加
出現此錯誤的原因是 Web 服務器上的內存限制
回到頂端
替代方法
要解決此問題
請使用以下任一方法
將數據分成較小的部分
然後將其移動到輸出流以供下載
從而獲取這些數據
以下代碼演示了如何完成此操作
重要說明
當您在 ASP
NET 應用程序的 nfig 文件中將編譯元素的 debug 屬性值設置為 false 時
必須針對要下載的文件大小將 server
scripttimeout 屬性設置為適當的值
默認情況下
server
scripttimeout 值被設置為
秒
但是
當 debug 屬性被設置為 true 時
server
scripttimeout 值將被設置為一個非常大的值(
秒)
作為一名開發人員
您必須知道這可能會對您的 ASP
NET Web 應用程序的行為造成的影響
此外
在下面的代碼中
您還必須知道與 filestream 構造函數一起使用的參數值
指定的枚舉值會對提供的功能產生重大影響
有關更多信息
請參考 參考 一節中的 filestream 鏈接
visual Basic
NET 代碼
Dim iStream As SystemIOStream
Buffer to read K bytes in chunk:
Dim buffer() 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 = SystemIOPathGetFileName(filepath)
Try
Open the file
iStream = New SystemIOFileStream(filepath SystemIOFileModeOpen _
IOFileAccessRead IOFileShareRead)
Total bytes to read:
dataToRead = iStreamLength
ResponseContentType = application/octetstream
ResponseAddHeader(ContentDisposition attachment; filename= & filename)
Read the bytes
While dataToRead >
Verify that the client is connected
If ResponseIsClientConnected Then
Read the data in buffer
length = iStreamRead(buffer )
Write the data to the current output stream
ResponseOutputStreamWrite(buffer length)
Flush the data to the HTML output
ResponseFlush()
ReDim buffer() Clear the buffer
dataToRead = dataToRead length
Else
prevent infinite loop if user disconnects
dataToRead =
End If
End While
Catch ex As Exception
Trap the error if any
ResponseWrite(Error : & exMessage)
Finally
If IsNothing(iStream) = False Then
Close the file
iStreamClose()
End If
End Try
Visual C#
NET 代碼
SystemIOStream iStream = null;
// Buffer to read K bytes in chunk:
byte[] buffer = new Byte[];
// 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 = SystemIOPathGetFileName(filepath);
try
{
// Open the file
iStream = new SystemIOFileStream(filepath SystemIOFileModeOpen
SystemIOFileAccessReadSystemIOFileShareRead);
// Total bytes to read:
dataToRead = iStreamLength;
ResponseContentType = application/octetstream;
ResponseAddHeader(ContentDisposition attachment; filename= + filename);
// Read the bytes
while (dataToRead > )
{
// Verify that the client is connected
if (ResponseIsClientConnected)
{
// Read the data in buffer
length = iStreamRead(buffer );
// Write the data to the current output stream
ResponseOutputStreamWrite(buffer length);
// Flush the data to the HTML output
ResponseFlush();
buffer= new Byte[];
dataToRead = dataToRead length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = ;
}
}
}
catch (Exception ex)
{
// Trap the error if any
ResponseWrite(Error : + exMessage);
}
finally
{
if (iStream != null)
{
//Close the file
iStreamClose();
}
}
將 DownloadFileName 替換為大於
MB 的文件的名稱
或
;
為用戶提供用於下載文件的鏈接
或
;
使用 Microsoft ASP
進行下載或者與 ASP 一起使用 Software Artisans FileUp
或
;
創建 ISAPI 擴展以下載文件
或
;
使用 FTP 下載文件
回到頂端
狀態
這種現象是設計導致的
回到頂端
更多信息
重現此問題的步驟
在 Microsoft Visual Basic
NET 或 Microsoft Visual C#
NET 中
新建一個 Web 應用程序項目
默認情況下
將創建 WebForm
aspx
將一個按鈕對象從工具箱拖到 WebForm
aspx
雙擊該按鈕對象以便在代碼視圖中打開 click 事件
將以下代碼粘貼到 Button
click 事件中
visual Basic
NET 代碼
Identify the file to download including its path
Dim filepath As String = DownloadFileName
Identify the file name
Dim filename As String = SystemIOPathGetFileName(filepath)
ResponseClear()
Specify the Type of the downloadable file
ResponseContentType = application/octetstream
Set the Default file name in the FileDownload dialog box
ResponseAddHeader(ContentDisposition attachment; filename= & filename & )
ResponseFlush()
Download the file
ResponseWriteFile(filepath)
Visual C#
NET 代碼
// Identify the file to download including its path
string filepath = DownloadFileName;
// Identify the file name
string filename = SystemIOPathGetFileName(filepath);
ResponseClear();
// Specify the Type of the downloadable file
ResponseContentType = application/octetstream;
// Set the Default file name in the FileDownload dialog box
ResponseAddHeader(ContentDisposition attachment; filename= + filename);
ResponseFlush();
// Download the file
ResponseWriteFile(filepath);
將 DownloadFileName 替換為大於
MB 的文件的名稱
在
調試
菜單上
單擊
開始
單擊
Button
From:http://tw.wingwit.com/Article/program/net/201311/13320.html