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