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. C++暂停黑窗口

    C++中采用system("pause");来暂停黑窗口,那么操纵系统就会将窗口暂停,显示“请按任意键继续. . .” 我们用VS执行代码是,若直接按键盘的F5(开始调试),那么窗 ...

  2. java常见日期格式转换以及日期的获取

    package com.test.TestBoot.SingleModel;import java.text.SimpleDateFormat;import java.util.Date;public ...

  3. 转:Centos7安装zabbix3.4超详细步骤解析

    安装前准备: 1.1 安装依赖包: yum -y install wget net-snmp-devel OpenIPMI-devel httpd openssl-devel java lrzsz f ...

  4. pycharm中提交Git 忽略部分代码

    痛点: 项目中,有些配置项,或者比较隐私的东东,不想上传 解决:在项目根路径下,创建.gitignore 文件     文件中可以写文件名.文件路径等 结果: 提交到git,发现果真没有dbconne ...

  5. [bzoj3668][Noi2014][起床困难综合症] (按位贪心)

    Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...

  6. use-gulp

    参考: https://github.com/Platform-CUF/use-gulp use-gulp 为什么使用gulp? 首先看一篇文章 Gulp的目标是取代Grunt 根据gulp的文档,它 ...

  7. Python接口测试之报告(十五)

    在本文章中,主要使用jenkins和编写的自动化测试代码,来生成漂亮的测试报告,关于什么是CI这些 我就不详细的介绍了,这里我们主要是实战为主. 首先搭建java的环境,这个这里不做介绍.搭建好jav ...

  8. ci框架(codeigniter)Email发送邮件、收件人、附件、Email调试工具

        ci框架(codeigniter)Email发送邮件.收件人.附件.Email调试工具 Email 类         CodeIgniter 拥有强大的 Email 类来提供如下的功能: 多 ...

  9. Codeforces 631D Messenger【KMP】

    题意: 给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s. 分析: KMP 这题唯一需要思考的地方就是如何处理字符串块.第一想到是把他们都展开然后进行KMP,可是展开后实在 ...

  10. 2017-10-02-morning

    T1 一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...