是什么使该HTTPS 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\";
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?     
已邀请:
使用Microsoft Network Monitor,我发现“ 1”会卡在应该发回客户端密钥交换的阶段。根本没有。服务器适当地等待着它,但是它从来没有来过。 解决此问题的原因是,它迫使HttpWebRequest使用SSL3而不是TLS(即使在必要时TLS应该自动转换为SSL3):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
为什么会这样,我想我永远不会知道-这些神秘事物中的一件,比我认识的人愿意花更多的时间来弄清楚... 与捕获不同的一件事是:TLS变体在Server Hello响应中具有一个“ Alert”条目,但SSL3交换以及所有实际起作用的TLS交换中都没有该条目。但是奇怪的是,在成功执行请求的Firefox捕获中也存在相同的警报。 最后,似乎是在我第一次发布此问题时,OCSP出现了暂时故障,此问题已得到解决。这增加了麻烦,但不是核心问题。     
HttpWebRequest / HttpWebReponse调用超时错误的典型原因是“未关闭响应对象/流”,这使连接保持活动状态。读取流的内容后,只需简单地关闭
Stream
对象或
HttpWebResponse
对象。默认连接限制为2。
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream stream = webResponse.GetResponseStream();
string responseString = ((TextReader)new StreamReader(stream)).ReadToEnd();
webResponse.Close();
或者,如果您在将由许多用户并发调用的Web服务中实现逻辑,则可能需要考虑增加HttpWebRequest对象中的连接限制。
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);    
webRequest.ServicePoint.ConnectionLimit = 20;
    
Windows 7上的.NET框架实现了TLS扩展:服务器名称指示(RFC4366)。根据您的帖子,此TLS警报表示服务器正在使用“无法识别的名称”来响应。不确定为什么报告连接超时,因为实际上不是。您的网络跟踪应显示此[FIN,ACK]之后,客户端会发起连接终止。降级为SSL3避免了SNI的调用。 仅供参考:Windows XP上的同一.NET框架不使用TLS服务器名称指示扩展名。您的程序将在那里工作。 就我而言,我追溯到Apache中缺少ServerName指令。将ServerName添加到SSL配置可以解决该问题,因为现在Web服务器不再知道其名称了。     
最近发现了与此相同的问题,并希望了解Microsoft是否已在较新的.net版本中解决此问题。这是我测试过的代码(出于隐私目的删除了域):
HttpWebRequest request =
    (HttpWebRequest)WebRequest.Create(\"https://www.xxSomeDomainNamexx.com/\");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
Console.WriteLine(reader.ReadToEnd());
针对.net 2.0、3.0和3.5版本进行了编译,所有这些似乎都表现出了与此处讨论的完全相同的行为。然后,我尝试针对4.0和4.5进行编译,并在两个地方均收到了正确的响应。 基于此,看来Microsoft可能已在较新的.net版本中解决了此问题。为了后代,我还测试了enverpex建议的SecurityProtocol更改,该更改在2.0、3.0和3.5上效果很好。     
我在使用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);
    
HTTPS客户端很可能无法验证此服务器提供的证书链,例如,由于缺少根证书或无法访问OCSP响应程序。即在浏览器和您使用的HTTPS客户端中可能会有一些不同的配置。 作为一种选择,您可以试用我们的HTTPBlackbox组件的版本,并尝试使用TElHTTPSClient进行连接。它将为您提供详细的错误信息(以防万一),以便您能够确定HttpWebRequest有什么问题。     

要回复问题请先登录注册