1.首先是服务器上发布资源,如果资源时自定义格式,比如 .zidingyi结尾的后缀文件,需要在MIME类型上添加处理方式
2.客户端采用WebRequest进行请求,WebRequest处理响应
public void DownLoadFile() { try { request = (HttpWebRequest)HttpWebRequest.Create(new Uri(vsServerPath)); request.KeepAlive = true; request.Timeout = 1000 * 10; request.ReadWriteTimeout = 1000 * 20; long startPos = 0; if (File.Exists(SavePath))//断点续传 { fs = File.OpenWrite(SavePath); if (fs.Length > 0)//对于已下载的索引文件,重新下载最后一个字节,否则AddRange会出错,因为文件大小获取是总的 { fs.Seek(fs.Length - 1, SeekOrigin.Current); startPos = fs.Length - 1; } else { fs.Seek(fs.Length, SeekOrigin.Current); startPos = fs.Length; } } else//全新下载 { string vsDir = Path.GetDirectoryName(SavePath); if (!Directory.Exists(vsDir)) { Directory.CreateDirectory(vsDir); } fs = new FileStream(SavePath, FileMode.Create); startPos = 0; } DownLoadedSize = startPos; if (startPos > 0) { request.AddRange(startPos); } byte[] buffer = new byte[1024 *32]; response = (HttpWebResponse)request.GetResponse(); reader = response.GetResponseStream(); int iRead = reader.Read(buffer, 0, buffer.Length); DownLoadedSize += iRead; while (iRead > 0) { fs.Write(buffer, 0, iRead); iRead = reader.Read(buffer, 0, buffer.Length); DownLoadedSize += iRead; } fs.Close(); reader.Close(); if (response != null) { response.Close(); } if (request != null) { request.Abort(); } } catch (Exception ex) { if (IFAbortExec) { Logger.LogDebug(SavePath); Logger.LogError(ex); } //断线重连 ++iReConnectTimes; if (iReConnectTimes > 5 || !IFAbortExec)//清理资源 { fs.Close(); if (reader != null) { reader.Close(); } if (response != null) { response.Close(); } if (request != null) { request.Abort(); } } else if (IFAbortExec)//异常中断才可重连,先清理资源 网速较慢的时候,连接有可能会关闭 { fs.Close(); if (reader != null) { reader.Close(); } if (response != null) { response.Close(); } if (request != null) { request.Abort(); } DownLoadFile(); } } }
原文:http://www.cnblogs.com/niuge/p/3614148.html