env*_*pex 19 .net c# https webrequest httpwebrequest
这是我的要求:
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();
Run Code Online (Sandbox Code Playgroud)
使用HttpFox从Firefox复制标题.我使用Fiddler2验证至少对于HTTP请求,标头在Firefox请求和我的请求之间是完全相同的.
但是,当使用HTTPS 对此特定网站执行请求时,请求会超时.它适用于其他网站.
我必须以不同的方式对Firefox执行,因为它始终适用于Firefox.但是,我无法使用Fiddler2调试它,因为每当Fiddler2转发这些请求时,它们也会超时,即使是由Firefox发起的.
它只是一个非常错误的网站吗?上面的哪一部分让我不喜欢Firefox?
env*_*pex 43
使用Microsoft网络监视器,我发现它HttpWebRequest会陷入它应该发回客户端密钥交换的阶段.它根本没有.服务器正式等待它,但它从未到来.
修复它的原因是强制HttpWebRequest使用SSL3而不是TLS(即使TLS应该在必要时自动变成SSL3):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我想我永远不会知道 - 只是其中一个需要花费更多时间来解决的神秘事物比我认识的任何人都愿意花...
捕获的一个不同之处是:TLS变体在服务器Hello响应中有一个"Alert"条目, SSL3交换中缺少该条目,实际工作的所有TLS交换也不存在.但奇怪的是,在成功执行请求的Firefox捕获中存在相同的警报.
最后,当我第一次发布这个问题时,似乎存在一个暂时的OCSP故障,此问题已经解决.这增加了混乱,但不是核心问题.
Pra*_*gam 11
使用HttpWebRequest/HttpWebReponse调用发生超时错误的典型原因是"不关闭响应对象/流",这会使连接保持活动状态.您必须在读取流的内容后关闭Stream对象或HttpWebResponse对象.默认连接限制为2.
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream stream = webResponse.GetResponseStream();
string responseString = ((TextReader)new StreamReader(stream)).ReadToEnd();
webResponse.Close();
Run Code Online (Sandbox Code Playgroud)
或者,如果您在将由许多用户同时调用的Web服务中实现您的逻辑,那么您可能需要考虑增加HttpWebRequest对象中的连接限制.
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
webRequest.ServicePoint.ConnectionLimit = 20;
Run Code Online (Sandbox Code Playgroud)
小智 9
Windows 7上的.NET框架实现了TLS扩展:服务器名称指示(RFC4366).根据您的帖子这个TLS警报是什么意思服务器响应"无法识别的名称".不知道为什么连接被报告超时,因为它确实没有.您的网络跟踪应显示客户端在此[FIN,ACK]之后启动连接终止.降级到SSL3可以避免调用SNI.
仅供参考:Windows XP上的相同.NET框架不使用TLS服务器名称指示扩展.你的程序将在那里工作....
在我的例子中,我追溯到Apache中缺少ServerName指令的情况.将ServerName添加到SSL配置解决了它,因为现在Web服务器不再不知道它的名称.
| 归档时间: |
|
| 查看次数: |
21137 次 |
| 最近记录: |