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

  • 相关阅读:
    被问到 Kafka,不要再说你不会了
    掌握Prometheus 监控思科交换机技能,这篇文章就够了!
    如何优雅的搞垮服务器,再优雅的救活
    Prometheus 监控思科交换机---Alertmanager 邮件报警展示报警
    处理一次k8s、calico无法分配podIP的心路历程
    被问到 Kafka,不要再说你不会了
    无休止?谷歌和甲骨文的十年版权纠纷案新进展
    搜狗开源 srpc:自研高性能通用 RPC 框架
    程序员进阶系列:你真的懂 HelloWorld 吗?
    GitHub 推出 Codespaces Beta
  • 原文地址:https://www.cnblogs.com/DSC1991/p/12552012.html
Copyright © 2020-2023  润新知