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)就对了。