C#使用https下载服务器文件

1.之前下载服务器文件的时候(错误日志文件,小文件,大文件另当别论哦),使用WebClient很方便就一句代码:

1 WebClient webClient=new WebClient();
2 webClient.DownloadFile("Uri/Address","fileName");

很方便,但是项目需要加了个双向证书认证就需要使用https在下载了(上面使用http),悲剧的是https下WebClient使用不了了,然后就又搜集其他方法:
参考了http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html文章,其中部分代码为:

 1             try
 2             {
 3                 //打开网络连接
 4                 HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.newxing.com/download/" + file);
 5                 if (SPosition > 0)
 6                     myRequest.AddRange((int)SPosition);             //设置Range值
 7                 //向服务器请求,获得服务器的回应数据流
 8                 Stream myStream = myRequest.GetResponse().GetResponseStream();
 9                 //定义一个字节数据
10                 byte[] btContent = new byte[512];
11                 int intSize = 0;
12                 intSize = myStream.Read(btContent, 0, 512);
13                 while (intSize > 0)
14                 {
15                     FStream.Write(btContent, 0, intSize);
16                     intSize = myStream.Read(btContent, 0, 512);
17                 }
18                 //关闭流
19                 FStream.Close();
20                 myStream.Close();
21                 flag = true;        //返回true下载成功
22             }
23             catch (Exception)
24             {
25                 FStream.Close();
26                 flag = false;       //返回false下载失败
27             }

然后做了修改简化了一下:

 1                 try
 2                 {
 3                     //声明HTTP请求
 4                     HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(URL));
 5 
 6                     //SSL安全通道认证证书
 7                     ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => { return true; });
 8                     X509Certificate cert = new X509Certificate(System.IO.Directory.GetCurrentDirectory() + @"\private.pfx", "changeit");
 9                     myRequest.ClientCertificates.Add(cert);
10 
11                     //向服务器请求,获得服务器的回应数据流
12                     Stream myStream = myRequest.GetResponse().GetResponseStream();
13                     StreamReader streamReader = new StreamReader(myStream);
14                     List<string> streamList = new List<string>();
15                     while (streamReader.ReadLine()!=null)
16                     {
17                         streamList.Add(streamReader.ReadLine());
18                     }
19                     File.WriteAllLines(saveDialog.FileName, streamList);
20                 }
21                 catch (WebException exp)
22                 {
23                     MessageBox.Show(exp.Message);
24                 }

其中红色字体是参考网上写的,奇怪的是读出来的txt文件总是少很多行,但是把while(true)写个死循环又单步走的时候数据又都取出来了,于是想获取一下

streamReader.ReadLine().Length,可是获得多了点但还是少几行。很是不解,于是改成while (streamReader.EndOfStream)就对了。

posted @ 2013-11-01 10:47  夜曲984  阅读(2574)  评论(0编辑  收藏  举报