C#中WebRequest请求的一些心得

佐手、 提交于 2020-03-23 14:32:29

在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);

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!