【问题】
C#中想要访问网址:
https://dynamic.12306.cn/otsweb/
结果调试了很多次,每次都是当调试执行:
resp = (HttpWebResponse)req.GetResponse(); |
的时候,没有任何异常,没有任何提示,直接跳出程序了,搞得很是莫名其妙,后来的后来,才注意到,原来网址是https的。所以想要弄明白,C#中,如何才能访问https类型网址。
【解决过程】
1.从这里:Using HTTPS in C#,知道了,未加密的http是端口80,而加密的https是端口443.
不过貌似其最后给出的代码,就是直接使用HttpWebRequest和HttpWebResponse的,和Http的没区别。
好像说是C#可以自动处理http还是https的。但是我此处却无法访问。不知道为何。
2.看到这里:在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求,说到,https的需要特殊处理,比如“要设置ServicePointManager类的ServerCertificateValidationCallback属性”等,但是我突然才发现,之前写过的代码,就遇到过https的,比如:
所以,说明之前C#就是可以自动处理http还是https。
所以,看来应该是这个12306网站比较特殊,估计需要某些特殊处理,可能才能正常访问吧。
3.看到这里:C# WebRequest处理Https请求,说是如果涉及到证书的话,需要加一个确认还是即可。
后来参照上述办法,就实现了对应的可用代码:
using System.Net.Security; using System.Security; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true;// Always accept } public HttpWebResponse getUrlResponse(string url) { HttpWebResponse resp = null; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); if(url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); } //... resp = (HttpWebResponse)req.GetResponse(); //... }
【总结】
对于一般的https类型的url,C#中HttpWebRequest和HttpWebResponse都是可以自动处理的,和普通的Http的没区别。
如果有些https的url,本身用浏览器访问,都需要证书之类的,那么C#代码中,则需要添加上述的ServicePointManager相关函数,即可。
【后记】
后来又看这里:C#、VB.NET使用HttpWebRequest访问https地址(SSL)的实现,的解释,其解释的更清楚:
SSL网站,连接时需要提供证书,对于非必须提供客户端证书的情况,只要返回一个安全确认即可。但是此方法的实现,在.NET 1.1 和 .NET 2.0 下是不同的。。。
转载请注明:在路上 » 【已解决】C#中如何访问https的网站/网址