1.首先是服务器上发布资源,如果资源时自定义格式,比如 .zidingyi结尾的后缀文件,需要在MIME类型上添加处理方式

需要注意的是.net里面要设置

System.Net.ServicePointManager.DefaultConnectionLimit = 50;

2.客户端采用WebRequest进行请求,WebRequest处理响应

 /// <summary>
/// Http协议下载助手
/// </summary>
public class HttpDownLoadHelper
{
#region 变量,属性
private HttpWebRequest request;
private HttpWebResponse response;
public string SavePath { get; set; }
public string URL { get; set; }
public string State { get; set; }
private int iReConnectTimes = 0;//重连次数
public long DownLoadedSize { get; set; }//已下载大小
private bool IFAbortExec = true;//是否异常中断
FileStream fs;
Stream reader;
#endregion
#region 构造函数
public HttpDownLoadHelper()
{
}
public HttpDownLoadHelper(string vsServerFilePath, string vsSavePath)
{
//request = (HttpWebRequest)HttpWebRequest.Create(new Uri(vsServerFilePath));
this.URL = vsServerFilePath;
SavePath = vsSavePath;
}
#endregion
#region 方法
/// <summary>
/// 读取已下载文件大小
/// </summary>
public void Init()
{
if (File.Exists(SavePath))//断点续传
{
fs = File.OpenWrite(SavePath);
DownLoadedSize = fs.Length;
fs.Close();
}
}
public void DownLoadFile(string vsServerFilePath, string vsSavePath)
{
URL = vsServerFilePath;
SavePath = vsSavePath;
DownLoadFile();
}
public void DownLoadFile()
{
try
{
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(URL));
request.KeepAlive = true;
request.Timeout = 1000 * 10;
request.ReadWriteTimeout = 1000 * 20;//不知道为啥,流read的时候会超时
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 (!string.IsNullOrEmpty(State) && State.ToUpper() == "PAUSED")
{
fs.Close();
return;
}
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.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();
} }
}
public void GetDownLoadedSize()
{
long startPos = 0;
if (File.Exists(SavePath))//断点续传
{
fs = File.OpenWrite(SavePath);
fs.Seek(fs.Length, SeekOrigin.Current);
startPos = fs.Length;
}
else//全新下载
{
fs = new FileStream(SavePath, FileMode.Create);
startPos = 0;
}
DownLoadedSize = startPos;
}
public void Abort()
{
try
{
IFAbortExec = false;//非异常中断
if (request != null)
{
request.Abort();
}
if (response != null)
{
response.Close();
}
if (fs != null)
{
fs.Close();
}
if (reader != null)
{
reader.Close();
}
}
catch (Exception ex)
{
Logger.LogError(ex);
}
}
public void Cancel()
{
Abort();
//删除文件
try
{
if (File.Exists(SavePath))
{
File.Delete(SavePath);
}
}
catch (Exception ex)
{
Logger.LogError(ex);
}
}
#endregion
}

c# Http下载的更多相关文章

  1. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  2. ASP.NET Aries 入门开发教程1:框架下载与运行

    背景: 鉴于框架的使用者越来越多,文档太少,不少用户反映框架的入门门槛太高. 好吧,再辛苦下,抽时间写教程吧! 步骤1:下载框架源码 开源地址:https://github.com/cyq1162/A ...

  3. WinForm 天猫2013双11自动抢红包【源码下载】

    1. 正确获取红包流程 2. 软件介绍 2.1 效果图: 2.2 功能介绍 2.2.1 账号登录 页面开始时,会载入这个网站:https://login.taobao.com/member/login ...

  4. C# Excel导入、导出【源码下载】

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  5. C# 条形码操作【源码下载】

    本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...

  6. mysql 7下载安装及问题解决

    mysql 7安装及问题解决 一.mysql下载 下载地址:https://www.mysql.com/downloads/ Community (GPL) Downloads MySQL Commu ...

  7. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  8. UE4新手引导之下载和安装虚幻4游戏引擎

    1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...

  9. Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)

    经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...

  10. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

随机推荐

  1. python3+beautifulSoup4.6抓取某网站小说(三)网页分析,BeautifulSoup解析

    本章学习内容:将网站上的小说都爬下来,存储到本地. 目标网站:www.cuiweijuxs.com 分析页面,发现一共4步:从主页进入分版打开分页列表.打开分页下所有链接.打开作品页面.打开单章内容. ...

  2. Kafka Broker配置

    Kafka发行包里自带的配置样本可以用来安装单机服务,但并不能满足大多数安装场景的要求.kafka有很多配置选项,Kafka有很多配置选项,涉及安装和调优的方方面面.不过大多数调优选项可以使用默认配置 ...

  3. Matlab学习笔记(四)

    二.MATLAB基础知识 (六)字符串 字符串的创建和简单操作 用单引号对括起来的一系列字符的组合,每个字符是一个元素,通常通过两个字节来存储 表2-22    字符串常见操作函数(e_two_37. ...

  4. javascript事件中'return false'详解

    浏览器中有很多异步事件,如click,mouseenter,mouseover等等,当用户执行相应操作之后,触发这个事件,然后执行相应的事件处理函数,一般情况下,我们可以通过三种方式给元素添加事件处理 ...

  5. Lucene的分词_中文分词器介绍

    Paoding:庖丁解牛分词器.已经没有更新了. MMSeg:搜狗的词库. MMSeg分词器的一些截图: 步骤: 1.导入包 2.创建的时候使用MMSegAnalyzer分词器

  6. python之字典 2014-4-5

    #字典:当索引不好用时1.字典 类似于php的关联数组 列表类似于索引数组 2.创建字典 phonebook={'alice':'2100','tom':'1900'} 键值之间用: 项之间用, 空字 ...

  7. codeforces 363B

    #include<stdio.h> #include<string.h> #define inf 999999999 #define N 151000 int a[N],c[N ...

  8. JSTL-函数标签库

    主页:http://www.cnblogs.com/EasonJim/p/6958992.html的分支页. 一.fn:contains() fn:contains()函数决定了一个输入字符串是否包含 ...

  9. SQL Server中迁移数据的几种方法

    1.通过工具"DTS"的设计器进行导入或者导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不 多,如果只是进行SQL Server数据库中部分表的 ...

  10. Nginx/Spring:增加上传文件尺寸限制

    Nginx: 1. vi /etc/nginx/nginx.config 2. 在server中增加如下行 # set client body size to 20M # client_max_bod ...