c#无法将POST数据写入https请求

时间:2013-11-30 22:23:36

标签: c# winforms https proxy

问题绝对奇怪,但我感谢任何建议。 应用程序使用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(); }

1 个答案:

答案 0 :(得分:0)

请参阅HTTPS web request failing

  

历史上,我见过的这种描述的大多数问题都会发生   当你忘记调用.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如何处理这个问题并使其发挥作用对我来说仍然是一种魔力。