C# 使用C创建SSL WebRequest
我正在编写一个代码,以编程方式读取a页面并下载其内容,但它的工作方式与浏览器不同。 注意,我还使用cookies字符串 我的代码是:C# 使用C创建SSL WebRequest,c#,https,httpwebrequest,webbrowser-control,C#,Https,Httpwebrequest,Webbrowser Control,我正在编写一个代码,以编程方式读取a页面并下载其内容,但它的工作方式与浏览器不同。 注意,我还使用cookies字符串 我的代码是: string strUrl = "http:" + "//mgac.webex." + "com"; string cookies_str = "vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R235
string strUrl = "http:" + "//mgac.webex." + "com";
string cookies_str = "vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R2355168776; JSESSIONID=Qlq1TR7Hf09KTsGHr4vv2GnTFF0NGRlLmGyYmMvzY5M29pbZ8yNp!31020270; DetectionBrowserStatus=3|1|32|1|4|2; CK_LanguageID_503319=1; CK_TimeZone_503319=4; CK_RegionID_503319=2; vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R2355168776; JSESSIONID=Qlq1TR7Hf09KTsGHr4vv2GnTFF0NGRlLmGyYmMvzY5M29pbZ8yNp!31020270;";
string other_saved_cookies = "screenWidth=1280; CK_CDNHostStatus=akamaicdn.webex.com|1322367753273|1";
string s;
using (WebClient client = new WebClient())
{
client.UseDefaultCredentials = true;
client.Headers.Add(HttpRequestHeader.Cookie, cookies_str);
s = client.DownloadString(strUrl);
}
我得到的答案是:
找不到该页
当我用Fiddler扫描请求时,我的浏览器收到相同的答案,然后他向同一主机发出使用SSL的新请求
我怎样才能发出与浏览器完全相同的请求来接收内容
告诉客户端:需要SSL连接的信息在哪里?这看起来像是您想要的 但将http更改为https可能是一个很好的起点! 然后,很显然,设置ServicePointManager.ServerCertificateValidationCallback,如上面文章的两个回复所示 编辑 加 然后 然后分析重定向结果的位置标头。检查此msdn链接 默认情况下,需要安全通道SSL复选框是清除的; 选择它以要求SSL。SSL同时支持40位和128位 加密。加密使用的比特数越多,越难识别 打破它,找出原来的部分是什么 一旦您将资源设置为需要SSL进行通信, 发送方和接收方之间发送的任何消息都将被加密 并签字。这意味着外部各方无法阅读内容 消息的一部分。如果外部方更改消息中的字节, 消息接收器可以检测到它 您应该需要一些凭证或证书信息才能完美地运行代码 您可以将RemoteCertificateValidationCallback委托用于 正在验证SSL证书 检查以下链接以获取代码帮助:
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
此网站使用302重定向将您带到SSL页面 WebClient.NET类是一个智能类,它自动遵循重定向。 它使用HttpWebRequest类并将设置为true 因此,如果您向原始URL发出请求,WebClient将使用新请求跳过重定向,而结果是302某种重定向。如果结果代码不同,您将得到结果。它看起来像一个http请求,但它执行2个http和1个https调用
在这种情况下,您必须将用户代理设置为以前发布的分流,因为远程站点不喜欢.NET的默认用户代理:无。如果您只想通过https ssl加载页面,这将起作用。如果您想查看证书,我建议使用完整的delgate方法
ServicePointManager.ServerCertificateValidationCallback = ( ( sender , certificate , chain , sslPolicyErrors ) => true ); //allows for validation of SSL certificates
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback( delegateHttpSsl );
private bool delegateHttpSsl(object obj, System.Security.Cryptography.X509Certificate c1, System.Security.Cryptography.X509Certifciates.X509Chain c2, SslPolicyErrors c3)
{
return true;
}
或使用完全委托方法
ServicePointManager.ServerCertificateValidationCallback = ( ( sender , certificate , chain , sslPolicyErrors ) => true ); //allows for validation of SSL certificates
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback( delegateHttpSsl );
private bool delegateHttpSsl(object obj, System.Security.Cryptography.X509Certificate c1, System.Security.Cryptography.X509Certifciates.X509Chain c2, SslPolicyErrors c3)
{
return true;
}
在Begging,浏览器建立http非安全连接,并接收未找到的页面,但告诉浏览器必须建立安全连接的信息在哪里?客户端必须如何知道需要安全连接?我无法在响应中得到它。确切地说,我不认为您可以从响应中推断出对SSL的需要。看到这个这样的线程:我不想推断,我只想做代码,如果需要的话,做一个https连接,从对http的第一次响应开始,用与代码显示完全相同的方式来描述它,您可以尝试使用示例代码中指定的相同url。当您从浏览器发出请求时,请使用Fiddler进行更详细的查看。如果添加用户代理字符串,则响应不同。如果没有这个头,你会得到一个重定向302,然后是一个成功的200。有了这个头,您会得到一个重定向,然后是另一个重定向,其中的位置头将您指向https站点。所以试试看,例如:stringua=User-Agent:Mozilla/5.0windowsnt6.1;WOW64;rv:8.0 Gecko/20100101 Firefox/8.0;client.Headers.AddHttpRequestHeader.UserAgent,ua;然后解析标题。