最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】C#中如何访问https的网站/网址

C# crifan 11779浏览

【问题】

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的,比如:

https://login.live.com/ppsecure/post.srf?wa=wsignin1.0&rpsnv=11&ct=1328070682&rver=6.1.6206.0&wp=MBI_SSL_SHARED&wreply=https:%2F%2Fskydrive.live.com%2F&lc=2052&id=250206&mkt=zh-CN&cbcxt=sky&bk=1328070683

所以,说明之前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的网站/网址

83 queries in 0.154 seconds, using 19.17MB memory