最近用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