【转载】C#中WebRequest请求的一些心得

最近用C#写了个WEB访问程序,之前没用过,各种踩坑。发现这篇文章总结得比较全面,转过来防身。这里面没有涉及到Cookie的处理,稍显遗憾。有时间的时候我自己总结下。
C#中用来进行远程请求的方法有很多,如WebClient,WebRequest等,也各有特点。今天在这里主要介绍WebRequest。

不需要证书验证,不需要登录的

下面两个方法的特点就是简单易使用,用于获取HTML文档。缺点就是无法处理那些需要证书的页面。

GET类型的请求

        //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类的请求

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

在这里插入图片描述
然后通过浏览器导航栏的锁标识,即可直接查看百度的相关证书信息。
在这里插入图片描述
在这里插入图片描述
通过对比可以知道,获取到的证书完全正确。所以如果想对访问的网站有证书检测,也可以通过这种方式。避免出现请求被拦截等问题。

原文出处:https://www.cnblogs.com/lgshare/p/9638081.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值