问题绝对奇怪,但我感谢任何建议。 应用程序使用3个线程并发送POST https请求。当我使用内部代理(Fiddler2)时,所有3个请求都成功发送。当我没有使用内部代理时,会发送2个请求,并且最后一个请求(取决于哪个线程更快地获得请求)将失败"超时"例外。它只是不能写POST数据。以下是请求示例(在不同的线程中发送3次):
//some data before request
byte[] byteArray3 = Encoding.ASCII.GetBytes(post_data_final3);
HttpWebRequest request3 = (HttpWebRequest)WebRequest.Create(site_URI);
WebHeaderCollection NewHeaders3 = request3.Headers;
request3.CookieContainer = new CookieContainer();
request3.Method = "POST";
request3.Timeout = 60000;
//some headers info here
try
{
using (Stream os3 = request3.GetRequestStream())
{
os3.Write(byteArray3, 0, byteArray3.Length);
}
}
catch (WebException ex33)
{
Console.WriteLine(ex33);
Console.WriteLine(ex33.Status);
}
try
{
HttpWebResponse response3 = (HttpWebResponse)request3.GetResponse();
//response handling..
}
catch (Exception e) {//catching exception}
在案例1中(使用Fiddler2),上述示例中的所有3个请求都运行良好。 在案例2中(不使用本地代理),2个请求完成,最新的请求在阶段抛出异常:
try
{
using (Stream os3 = request3.GetRequestStream())
{
os3.Write(byteArray3, 0, byteArray3.Length);
}
}
catch (WebException ex33)
{
Console.WriteLine(ex33);
Console.WriteLine(ex33.Status);
}
请注意,多线程和锁定已实现正常,因此请在Proxy和/或https协议中使用。 我每次都可以使用本地代理,但我不想这样做。谢谢!
更新:找到解决方案。在最后阶段结束所有回复变得有效:
try
{
HttpWebResponse response3 = (HttpWebResponse)request3.GetResponse();
//response handling..
}
catch (Exception e) {//catching exception}
finally { response3.Close(); }
答案 0 :(得分:0)
历史上,我见过的这种描述的大多数问题都会发生 当你忘记调用.Close()时返回的对象 的GetResponseStream()。问题的存在是因为当你忘记了 关闭第一个请求,第二个请求死锁等待一个 免费连接。
通常,此挂起发生在第3个请求上,而不是第二个请求。
更新:看看你的repro,这与订单无关 请求。您正在发送问题,因为该网站正在发送 在HTTPS握手开始时的TLS警告,以及.NET将 发生时超时。看到 http://blogs.msdn.com/b/fiddler/archive/2012/03/29/https-request-hangs-.net-application-connection-on-tls-server-name-indicator-warning.aspx。 问题只在Windows Vista及更高版本上出现,因为 警告与HTTPS中不存在的TLS扩展相关 在WinXP上堆栈。
但Fiddler2如何处理这个问题并使其发挥作用对我来说仍然是一种魔力。