Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 是什么导致此HTTPS WebRequest在浏览器中工作时超时?_C#_.net_Https_Httpwebrequest_Webrequest - Fatal编程技术网

C# 是什么导致此HTTPS WebRequest在浏览器中工作时超时?

C# 是什么导致此HTTPS WebRequest在浏览器中工作时超时?,c#,.net,https,httpwebrequest,webrequest,C#,.net,Https,Httpwebrequest,Webrequest,这是我的要求: var request = (HttpWebRequest) WebRequest.Create("https://mtgox.com/"); request.CookieContainer = new CookieContainer(); request.AllowAutoRedirect = false; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; re

这是我的要求:

var request = (HttpWebRequest) WebRequest.Create("https://mtgox.com/");
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = false;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
request.Headers[HttpRequestHeader.AcceptLanguage] = "en-gb,en;q=0.5";
request.Headers[HttpRequestHeader.AcceptCharset] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
request.Timeout = 5000;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
request.Method = "GET";

request.GetResponse();
标题是使用HttpFox从Firefox复制的。我使用Fiddler2验证了至少对于HTTP请求,Firefox请求和我的请求之间的头是完全相同的

但是,当使用HTTPS执行对此特定网站的请求时,请求只是超时。它适用于其他网站

我必须以不同于Firefox的方式执行它,因为它总是在Firefox中工作。但是,我无法使用Fiddler2调试它,因为每当Fiddler2转发这些请求时,它们也会超时,即使是由Firefox发起的请求


这真的是一个有缺陷的网站吗?上面哪一部分告诉我不是Firefox?

很可能HTTPS客户端无法验证此服务器提供的证书链,例如,由于缺少根证书或无法访问OCSP响应程序。也就是说,可以在浏览器和您使用的HTTPS客户端中配置不同的内容


作为选项之一,您可以使用我们组件的试用版,并尝试使用TElHTTPSClient进行连接。它将为您提供详细的错误信息(在发生错误的情况下),以便您能够确定HttpWebRequest的错误

使用Microsoft Network Monitor,我发现
HttpWebRequest
会陷入一个应该发回客户端密钥交换的阶段。但事实并非如此。服务器及时地等待它,但它一直没有来

修正了它迫使HttpWebRequest使用SSL3而不是TLS的问题(即使TLS应该在必要时自动转换为SSL3):

为什么会这样,我想我永远也不会知道——只是那些神秘的事情中的一件,需要比我认识的任何人都愿意花更多的时间去弄清楚

捕获有一个不同之处:TLS变体,它在SSL3交换和所有实际工作的TLS交换中都不存在。但奇怪的是,Firefox成功执行请求的捕获中也出现了相同的警报


最后,就在我第一次发布这个问题时,似乎有一个暂时的OCSP故障,这个问题已经解决了。这增加了混乱,但不是核心问题。

Windows 7上的.NET framework实现了TLS扩展:服务器名称指示(RFC4366)。根据您的帖子,服务器正在以“无法识别的名称”进行响应。不确定为什么报告连接超时,因为它确实没有超时。您的网络跟踪应显示客户端在此[FIN,ACK]之后启动连接终止。降级到SSL3可以避免调用SNI

仅供参考:Windows XP上的同一.NET framework不使用TLS服务器名称指示扩展名。您的程序将在那里工作


在我的例子中,我跟踪到Apache中缺少一个ServerName指令。将服务器名添加到SSL配置中解决了此问题,因为现在web服务器不再不知道其名称。

最近发现了同样的问题,并希望查看Microsoft是否已在较新的.net版本中修复此问题。这是我测试的代码(出于隐私考虑删除域):

根据.net版本2.0、3.0和3.5编译了这篇文章,所有这些似乎都表现出了与大家讨论的完全相同的行为。然后我试着根据4.0和4.5进行编译,并在这两个地方都得到了正确的响应


基于此,微软似乎已经在较新的.net版本中解决了这个问题。对于后代,我还测试了enverpex建议的SecurityProtocol更改,它在2.0、3.0和3.5上运行良好。

HttpWebRequest/HttpWebResponse调用超时错误的典型原因是“未关闭响应对象/流”,这会使连接保持活动状态。读取流的内容后,只需关闭
对象或
HttpWebResponse
对象即可。默认连接限制为2

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream stream = webResponse.GetResponseStream();
string responseString = ((TextReader)new StreamReader(stream)).ReadToEnd();
webResponse.Close();

可选地,如果您在许多用户同时调用的Web服务中实现了逻辑,那么您可能需要考虑增加HtpWebRebug对象中的连接限制。

HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);    
webRequest.ServicePoint.ConnectionLimit = 20;

我对https请求也有同样的超时问题,但没有一个答案对我有帮助。刚才我找到了解决问题的办法。请注意,这仅适用于.net framework 4.5或更高版本

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var response = WebRequest.Create("https://yoursecurewebservice").GetResponse();
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(body);

HM,在FIDDLR2中间,通过HTTPS连接到谷歌导致了一个关于无效证书的异常——不仅仅是挂起/超时……@ EnvipEx我会在OCSP或CRL检查上下注-它们需要额外的HTTP(S)连接,这些连接可以超时。但这是您需要自己调试的东西-我们只能在这里猜测。使用HTTPS/mtgox.com/443的HTTPBlackbox\HTTPGet示例“连接失败”也会发生同样的情况。您说过应该有详细的错误信息,但我在exception对象中找不到更多其他信息。你能告诉我去哪里看吗?@enverpex这意味着没有与该网站的连接。很可能是某个防火墙让浏览器通过,但阻止了您的应用程序。此外,如果您处理OneError事件,则可能会有扩展信息可用。使用OneError,结果表明这是一个证书验证问题。TelHttpScClient引发的异常也可能提到错误代码。我猜,就像你说的,StartCom证书由于某种原因无法通过.NET或你的代码进行验证,但可以通过Firefox和Chrome进行验证。即使“”本身也会导致HTTPBlackbox中的“连接失败”。您还可以使用Java 7关闭SNI的发送:@enverpex-您这个了不起的混蛋!!在过去的几个小时里,我一直在抱怨为什么我的HttpWebRequest在某个特定的网站上出现了停顿,我尝试了所有的标题,这是唯一有效的代码,谢谢!!!!!上帝保佑你,先生!这是发生在我
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);    
webRequest.ServicePoint.ConnectionLimit = 20;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var response = WebRequest.Create("https://yoursecurewebservice").GetResponse();
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(body);