zoukankan      html  css  js  c++  java
  • 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)就对了。

  • 相关阅读:
    筛法“四不像”——《C解毒》试读
    五花八门的main()
    新编《守株待兔》—C语言版—兼聊为什么不应该用%d格式转换输出指针
    含糊之过、多做之过及乱做之过
    怎样调戏程序
    混乱是怎样炼成的——《C解毒》试读
    到处忙活与一劳永逸
    “函数声明”、“函数原型”与“函数定义”辨析
    关于函数原型的对话
    内裤外穿——错位及不伦不类
  • 原文地址:https://www.cnblogs.com/Seek-logic/p/3401232.html
Copyright © 2011-2022 走看看