惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - greatqn

web方式修改svn密码 java程序用pid重启 ant编译android项目 apache ci 的404设置 mysql主从同步操作,及队列设计 花瓣采集js解析 Gearman安装,测试笔记 自己写过的一个vba脚本,用于移动copy一点数据。 jquery代码收藏 [php代码]从svn获取指定版本,并同步到ftp上。 jquery表格jqGrid操作笔记。 js调试工具 ci_sae 监控项目示例 Sina App Engine 初级入门 被baidu拔毛后的恢复之路 linux操作,杂记 - greatqn - 博客园 一个备份dos脚本 jconsole本地连接失败的故障解决 [转]又拍网架构中的分库设计
C#登录https网站并下载文件
greatqn · 2011-07-12 · via 博客园 - greatqn

.net很久没用了,最近要做个小工具下载一个https的内容,想来想去还是.net的环境最方便。java要装jdk,python也要python的环境,php有php的环境。

主要功能代码都从网上收集,这里记录一些片段,用作备份。

1.登录https

            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(url) as HttpWebRequest;
                request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(url) as HttpWebRequest;
            }
        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受
        }

本来想着https的连接需要证书的,原来还可以跳过证书的验证,直接返回true就行了,实践证明可以连接成功。HTTPS连接最初的若干毫秒

2.继续访问

完成登录后,要保持这个session,查看response.Headers["Set-Cookie"],可以看到cookie里的session信息,只要把这些cookie内容在下一次请求时带上就行了。

请求时cookie的转换代码:

            string cookieString = response.Headers["Set-Cookie"];
            CookieCollection cookies = new CookieCollection();
            Regex re = new Regex("([^;,]+)=([^;,]+); path=([^;,]+); expires=([^;,]+)", RegexOptions.IgnoreCase);//视具体内容进行调整
            foreach (Match m in re.Matches(cookieString))
            {
                Cookie c = new Cookie(m.Groups[1].Value, m.Groups[2].Value);
                c.Domain = "yourDomain";//放你要访问网站的域名
                cookies.Add(c);
            }

3.下载文件

请求的是一个下载链接,另存为的文件名,在response.Headers里。通过字符串操作把它提取出来。

文件内容要通过流的方式,把它读出来,保存成文件。

Stream stream = response.GetResponseStream();
FileStream fs = new FileStream(file, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
BinaryReader br = new BinaryReader(stream);

byte[] nbytes = new byte[2048];
int nReadSize = 0;
nReadSize = br.Read(nbytes, 0, 2048);
while (nReadSize > 0)
{
      bw.Write(nbytes, 0, nReadSize);
      nReadSize = br.Read(nbytes, 0, 2048);
}
bw.Close();
br.Close();