asp.net 能否多线程断点续传?
在博客園上一搜就可以找到很多關于“asp.net 多線程斷點續傳”這方面的文章,如
http://zzk.cnblogs.com/s?w=asp.net+%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0&p=1
但是經過我測試,沒有一個是真正實用的。
在這篇文章中(http://www.cnblogs.com/bestcomy/archive/2004/08/10/31950.html)我2007年就留言:(37樓),問題到現在還沒有解決。
使用如下方法測試:
1、vs2010直接啟用調試。
2、把代碼編譯到release版本,.NET 2.0、.NET 4.0 都有,分別發布到win2003+iis6、win2008+iis7中。
3、然后用下載軟件(如網絡傳送帶、網絡螞蟻、迅雷等)訪問這個提供下載的網址,下載軟件開10個任務,每個任務10線程,每個任務下載限速50K左右。
結果造成asp.net給直接掛起了!嘗試訪問任何aspx的頁面則一直處于掛起狀態,即頁面無法打開,IE9選項卡的那個狀態標志一直在轉。
一開始以為是測試系統IE9達到最大鏈接數了(但是開其他第三方網站是可以的),馬上在其他電腦訪問也不行,狀態一直掛起,甚至影響到這臺服務器上的其他網站,只要是aspx的全部死掉,靜態的又可以正常訪問(jpg、css、js等文件),服務器的cpu和內存不占多少,幾乎可忽略,下載軟件停止下載后又恢復了!實在是想不出什么好方法了。
再次附上我的代碼,和在博客園搜到文章上的差不多:
protected void Page_Load(object sender, EventArgs e){
string q = Request.QueryString.Get("q");
System.IO.FileInfo f = new System.IO.FileInfo(Server.MapPath("/") + q);
int speed = 5000;//5K
FileStream file = new FileStream(f.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader br = new BinaryReader(file);
Response.AddHeader("Accept-Ranges", "bytes");
Response.Buffer = false;
long fileLength = file.Length;
long startBytes = 0;
int buff = 10240; //每線程10K bytes
int sleep = 1000 * buff / speed;
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startBytes = Convert.ToInt64(range[1]);
}
// 添加頭信息,指定文件大小,讓瀏覽器能夠顯示下載進度
Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
if (startBytes != 0)
{
//支持多線程,文件分段處理
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
}
//保持鏈接
Response.AddHeader("Connection", "Keep-Alive");
//設置輸出流數據類型。添加頭信息,為"文件下載/另存為"對話框指定默認文件名
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(f.Name, System.Text.Encoding.UTF8));
//定義流的位置
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
long dataSent = fileLength - startBytes;
long dataLeft = 0;
while (dataLeft < dataSent)
{
if (Response.IsClientConnected)
{
Response.BinaryWrite(br.ReadBytes(buff));
dataLeft += buff;
Response.Flush();
Thread.Sleep(sleep);
}
else
{
dataSent = -1;
}
}
Response.End();
br.Close();
file.Close();
}
?
?
轉載于:https://www.cnblogs.com/zzmsl/archive/2011/12/05/can_multi-threaded_downloading_with_aspdotnet.html
總結
以上是生活随笔為你收集整理的asp.net 能否多线程断点续传?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决报错: No candidates
- 下一篇: 将.NET dll注册到GAC(Glob