asp.net 能否多线程断点续传?
在博客園上一搜就可以找到很多關(guān)于“asp.net 多線程斷點(diǎn)續(xù)傳”這方面的文章,如
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
但是經(jīng)過(guò)我測(cè)試,沒(méi)有一個(gè)是真正實(shí)用的。
在這篇文章中(http://www.cnblogs.com/bestcomy/archive/2004/08/10/31950.html)我2007年就留言:(37樓),問(wèn)題到現(xiàn)在還沒(méi)有解決。
使用如下方法測(cè)試:
1、vs2010直接啟用調(diào)試。
2、把代碼編譯到release版本,.NET 2.0、.NET 4.0 都有,分別發(fā)布到win2003+iis6、win2008+iis7中。
3、然后用下載軟件(如網(wǎng)絡(luò)傳送帶、網(wǎng)絡(luò)螞蟻、迅雷等)訪問(wèn)這個(gè)提供下載的網(wǎng)址,下載軟件開(kāi)10個(gè)任務(wù),每個(gè)任務(wù)10線程,每個(gè)任務(wù)下載限速50K左右。
結(jié)果造成asp.net給直接掛起了!嘗試訪問(wèn)任何aspx的頁(yè)面則一直處于掛起狀態(tài),即頁(yè)面無(wú)法打開(kāi),IE9選項(xiàng)卡的那個(gè)狀態(tài)標(biāo)志一直在轉(zhuǎn)。
一開(kāi)始以為是測(cè)試系統(tǒng)IE9達(dá)到最大鏈接數(shù)了(但是開(kāi)其他第三方網(wǎng)站是可以的),馬上在其他電腦訪問(wèn)也不行,狀態(tài)一直掛起,甚至影響到這臺(tái)服務(wù)器上的其他網(wǎng)站,只要是aspx的全部死掉,靜態(tài)的又可以正常訪問(wèn)(jpg、css、js等文件),服務(wù)器的cpu和內(nèi)存不占多少,幾乎可忽略,下載軟件停止下載后又恢復(fù)了!實(shí)在是想不出什么好方法了。
再次附上我的代碼,和在博客園搜到文章上的差不多:
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]);
}
// 添加頭信息,指定文件大小,讓瀏覽器能夠顯示下載進(jìn)度
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");
//設(shè)置輸出流數(shù)據(jù)類(lèi)型。添加頭信息,為"文件下載/另存為"對(duì)話(huà)框指定默認(rèn)文件名
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();
}
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zzmsl/archive/2011/12/05/can_multi-threaded_downloading_with_aspdotnet.html
總結(jié)
以上是生活随笔為你收集整理的asp.net 能否多线程断点续传?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决报错: No candidates
- 下一篇: 背包学习————完全背包