C#中WebRequest请求的一些心得

在C#开发中经常需要进行Web远程访问,方法很多,也使用了很久,但一直没有做一个总结。

  C#中用来进行远程请求的方法有很多,如WebClient,WebRequest等,也各有特点。今天在这里主要介绍WebRequest。

        先从相对入门的不需要证书验证,不需要登录的开始。

 

//GET类型的请求
        public string GetContent(string uri, Encoding coding)
        {
            //Get请求中请求参数等直接拼接在url中
            WebRequest request = WebRequest.Create(uri);

            //返回对Internet请求的响应
            WebResponse resp = request.GetResponse();

            //从网络资源中返回数据流
            Stream stream = resp.GetResponseStream();

            StreamReader sr = new StreamReader(stream, coding);

            //将数据流转换文字符串
            string result = sr.ReadToEnd();

            //关闭流数据
            stream.Close();
            sr.Close();

            return result;
        }
//POST
        public string GetContentPost(string uri, string data, Encoding coding)
        {
            WebRequest request = WebRequest.Create(uri);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";

            //将字符串数据转化为字节串,这也是POST请求与GET请求区别的地方
            byte[] buffer = coding.GetBytes(data);
            
            //用于将数据写入Internet资源
            Stream stream = request.GetRequestStream();
            stream.Write(buffer, 0, buffer.Length);
            request.ContentLength = buffer.Length;

            WebResponse response = request.GetResponse();

            //从网络资源中返回数据流
            stream = response.GetResponseStream();

            StreamReader sr = new StreamReader(stream, coding);

            //将数据流转换文字符串
            string result = sr.ReadToEnd();

            //关闭流数据
            stream.Close();
            sr.Close();

            return result;
        }
//回调验证证书问题
        public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            //直接返回true,接受指定证书进行身份验证  
            return true;
        }

        //Get
        public string GetContent(string uri, Encoding coding)
        {

            //下面一行代码一定卸载请求开始前。
            //使用回调的方法进行验证。
            ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
            
            //Get请求中请求参数等直接拼接在url中
            WebRequest request = WebRequest.Create(uri);

            //返回对Internet请求的响应
            WebResponse resp = request.GetResponse();

            //从网络资源中返回数据流
            Stream stream = resp.GetResponseStream();

            StreamReader sr = new StreamReader(stream, coding);

            //将数据流转换文字符串
            string result = sr.ReadToEnd();

            //关闭流数据
            stream.Close();
            sr.Close();

            return result;
        }

        //POST
        public string GetContentPost(string uri, string data, Encoding coding)
        {
            //下面一行代码一定卸载请求开始前。
            //使用回调的方法进行验证。
            ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);

            WebRequest request = WebRequest.Create(uri);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";

            //将字符串数据转化为字节串,这也是POST请求与GET请求区别的地方
            byte[] buffer = coding.GetBytes(data);

            //用于将数据写入Internet资源
            Stream stream = request.GetRequestStream();
            stream.Write(buffer, 0, buffer.Length);
            request.ContentLength = buffer.Length;

            WebResponse response = request.GetResponse();

            //从网络资源中返回数据流
            stream = response.GetResponseStream();

            StreamReader sr = new StreamReader(stream, coding);

            //将数据流转换文字符串
            string result = sr.ReadToEnd();

            //关闭流数据
            stream.Close();
            sr.Close();

            return result;
        }
//只需在证书验证的回调函数中添加几行代码即可
//
回调验证证书问题 public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { Console.WriteLine("证书的有效日期:" + certificate.GetEffectiveDateString()); Console.WriteLine("证书的到期日期:" + certificate.GetExpirationDateString()); Console.WriteLine("证书格式名称:" + certificate.GetFormat()); Console.WriteLine("证书办法机构名称:" + certificate.Issuer); Console.WriteLine("密钥算法信息:" + certificate.GetKeyAlgorithm()); Console.WriteLine("证书的公钥:" + certificate.GetPublicKeyString()); Console.WriteLine("证书序列号:" + certificate.GetSerialNumberString()); // 总是接受 return true; }

使用如下GET方式访问百度。即可得到截图效果。  

    GetContent("https://www.baidu.com/", Encoding.UTF8);
    Console.WriteLine(str);

 

posted @ 2020-03-23 14:27  哈根达斯  阅读(646)  评论(0编辑  收藏  举报