这是我写的下载类
using System;
using System.Net;
using System.IO;namespace FengYu.FileDownload
{
public class Downloader
{
private const int downloadBlockSize = 1024;
public void DownloadFile()
{
if (this.fileLocalPath == null)
return;
try
{
// create the download buffer
byte[] buffer = new byte[downloadBlockSize];
int readCount;
// read a block of bytes and get the number of bytes read
while((int)(readCount = DownloadStream.Read(buffer, 0, downloadBlockSize)) > 0)
{
// save block to end of file
SaveToFile(buffer, readCount, this.fileLocalPath);
// update total bytes read
totalDownloaded += readCount;
}
}
finally
{
if( response != null)
response.Close();
this.isFileDownload = true; 
}
//return true;
}//将数据流保存到本地文件
private void SaveToFile(byte[] buffer, int count, string fileName)
{
FileStream f = null;try
{
f = File.Open(fileName, FileMode.Append, FileAccess.Write);
f.Write(buffer, 0, count);
}
finally
{
if(f != null)
f.Close();
}
}public void Connect()
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(this.url);
response = (HttpWebResponse) request.GetResponse();
if (response.StatusCode == HttpStatusCode.NotFound )
{
this.isFileExist = false;
return ;
}
if (response.StatusCode == HttpStatusCode.OK)
{
fileSize = response.ContentLength;
fileLastModifyInInternet = response.LastModified;
this.isFileExist = true;
}
}
private long fileSize;  //文件大小
private string fileLocalPath; //文件本地路径
private DateTime fileLastModifyOnLocal;  //本地最后修改时间
private DateTime fileLastModifyInInternet;  //网上最后修改时间
private HttpWebResponse response;  
private Stream stream;  //取得返回流
private long start;  //文件中下载点
private bool isFileExist;  //网络中文件是否存在?
private bool isFileDownload;  //文件是否下载完成?
private string url;  //文件的网络地址
private long totalDownloaded; //已下载的数据量#region  //定义属性
public Stream DownloadStream
{
get
{
if(this.start == this.fileSize)
return Stream.Null;
if(this.stream == null)
this.stream = this.response.GetResponseStream();
return this.stream;
}
}public long TotalDownloaded
{
get
{
return this.totalDownloaded;
}
}
public string FileLocalPath  //本地文件路径
{
set
{
this.fileLocalPath = value;
}
get
{
return this.fileLocalPath;
}
}
public string Url //下载文件的网络地址
{
set
{
this.url = value;
}
get
{
return this.url;
}
}
public bool IsFileExist   //互联网上文件是否存在?
{
get
{
return this.isFileExist;
}
}
public bool IsFileDownload  //文件是否已下载完成
{
get
{
return this.isFileDownload;
}
}
public long FileSize  //文件大小
{
get
{
return this.fileSize ;
}
}
public DateTime FileLastModifyOnLocal  //本地中文件最近下载的时间
{
set
{
this.fileLastModifyOnLocal = value;
}
get
{
return this.fileLastModifyOnLocal ;
}
}
public DateTime FileLastModifyInInternet  //互联网中文件最近修改的时间
{
get
{
return this.fileLastModifyInInternet ;
}
}
#endregionpublic void Close()
{
this.response.Close();
}
}
}
下面是调用类的窗体的主要代码:
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}private Thread mythread;private void Download_Click(object sender, System.EventArgs e)
{
FileOne.FileLocalPath = LocalPathOfFile.Text;
FileOne.Url = UrlOfFile.Text;
FileOne.Connect();
if (FileOne.IsFileExist == false)
return;
progressBarDownload.Minimum = 0;
progressBarDownload.Maximum = (int)FileOne.FileSize;
timer1.Enabled = true;
txtBoxMessage.Text = FileOne.FileSize.ToString();
mythread = new Thread(new ThreadStart(FileOne.DownloadFile));
mythread.Start();}
private Downloader FileOne = new Downloader();
private void timer1_Tick(object sender, System.EventArgs e)
{
if (FileOne.IsFileDownload == true)
{
txtBoxMessage.Text += "下载已完成!";
timer1.Stop();
}
long percentD ;
percentD = FileOne.TotalDownloaded * 100/FileOne.FileSize;
labelDownloadPercent.Text = percentD.ToString() + "%";
progressBarDownload.Value = (int)FileOne.TotalDownloaded;
}
1、上面的代码下载几百k的文件的时候没有什么问题,但是在天极网下载文件(如http://dl1.mydown.com/soft1/200507/FlashFXP_3.2.0.1080_SC.exe)的时候却屡屡出错,编译环境提示 “while((int)(readCount = DownloadStream.Read(buffer, 0, downloadBlockSize)) > 0)”超时等待,估计是网络堵塞的原因。不知各位兄弟姐妹有何解决方法?
2、在下载天空软件上的文件时(如http://conut.skycn.com/softdownload.php?id=15809&url=http://jsyz.driversky.com/down/eMule-0.46c-VeryCD0913Install.exe,实际用的url是http://jsyz.driversky.com/down/eMule-0.46c-VeryCD0913Install.exe)返回的文件大小只有4720字节,这是不是因为地址转向造成的,如何解决? 

解决方案 »

  1.   

    HttpWebRequest类默认只有90秒的等待时间,超过这个时间就超时出错了,你可以加大这个超时时间
    Timeout = 1000;或者使用异步调用的方式,BeginGetResponse、EndGetResponse这样就不会有超时限制
      

  2.   

    1.网络慢了谁都没法你只能加大Timeout时间,捕捉异常2.监测Header,发现303 moved信息就转向新的url
      

  3.   

    个人觉得加大timeout的时间有时候也未必能从根本上解决问题,即便延长了时间,系统的资源基本上也殆尽了。建议使用异步的方法或者参考一下现在推出的AJAX技术。