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

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

C# crifan 11256浏览 0评论

【问题】

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的网站/网址

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 最近需要用C# httpwebrequest的POST方法提交img图片到https的网站,遇到了诸多问题。 1. 看了你的文章,确实C# httpwebrequest对于证书的问题是有的网站不需要证书,有的需要。说明只要程序不报错并且数据返回正常,说明该网站不需要手动加载客户端证书。 2. 但是对于POST数据这块,一直没有成功。网站的返回提示“用户名错误”,经检查,用户名必须正确,因为已经用该用户名对网站的登录网页进行了测试,表示成功。POST表单提交的数据有一个用户名,一个密码,还有一个input=type类型的需要上传的图片。总是提交不成功,demon网址为https://www.peuland.com/captcha/captcha_demo.htm,还请指点。
    willhuo11年前 (2013-10-03)回复
    • 1.我用网页操作的时候,也还是返回user error。 2.在如此错误的前提下,如何分析,如何写代码模拟,都给你写成教程了: 【教程】模拟登陆之如何分析并用代码模拟上传文件 3.你自己确保: 在网页中操作的时候,确认用户名和密码都正确,然后选择一个合适图片,可正常解析。 之后,再参考我的代码,去写代码模拟,即可。
      crifan11年前 (2013-10-06)回复
87 queries in 0.177 seconds, using 22.09MB memory