Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C创建SSL WebRequest_C#_Https_Httpwebrequest_Webbrowser Control - Fatal编程技术网

C# 使用C创建SSL WebRequest

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

我正在编写一个代码,以编程方式读取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=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;然后解析标题。