title: Can't set HttpWebRequest timeout higher than 100 seconds when doing a POST?
body: <p>I am running into an issue where HttpWebRequest won't respect a timeout value higher than 100 seconds when doing a POST. However, if the request is a GET, a timeout value higher than 100 seconds is respected. The timeout exception is thrown at the .GetResponse() call. I'm setting all the timeout values I have been able to discover but it seems I am missing one, or there is a bug in the framework. </p>
  
  <p>This is a C# app targeting the .NET Framework 3.5, built using Visual Studio 2008. The web server is IIS 6.0 with a connection timeout set to the default 120 seconds, keep-alives enabled... again GET requests respect the timeout value I specify, POST requests respect the timeout if &lt;= 100 seconds.</p>
  
  <p>Here is my code:</p>
  
  <pre><code>int timeout = 200000; // 200 seconds
  HttpWebRequest proxyRequest = (HttpWebRequest)WebRequest.Create(serverUrl);
  proxyRequest.Accept = clientRequest.AcceptTypes.ToDelimitedString(", ");
  proxyRequest.Method = "POST"
  proxyRequest.UserAgent = clientRequest.UserAgent;
  proxyRequest.Timeout =  timeout;
  proxyRequest.ReadWriteTimeout = timeout;
  proxyRequest.KeepAlive = false;
  proxyRequest.AllowAutoRedirect = false;
  proxyRequest.ServicePoint.Expect100Continue = false;
  proxyRequest.ServicePoint.MaxIdleTime = timeout;
  proxyRequest.ServicePoint.ConnectionLeaseTimeout = -1;
  
  try
  {
      // add post data
      request.ContentType = "application/x-www-form-urlencoded";
      byte[] postData = Encoding.UTF8.GetBytes("somedata=7&amp;moredata=asdf");
      // set some post data
      request.ContentLength = postData.Length;
      using (Stream stream = request.GetRequestStream())
      {
          stream.Write(postData, 0, postData.Length);
          stream.Close();
      }
  
      // UPDATE
      // don't set Timeout here! It will be ignored
      // proxyRequest.Timeout = timeout;
  
      // Timeout exception thrown here if GetResponse doesn't return within 100 seconds
      // even though the Timeout value is set to 200 seconds.
      using (HttpWebResponse proxyResponse = (HttpWebResponse)proxyRequest.GetResponse())
      {
          using (Stream stream = proxyResponse.GetResponseStream())
          {
              using (StreamReader reader = new StreamReader(stream, Encoding.Default))
              {
                  string content = reader.ReadToEnd();
                  [other pointless code for this example]
                  reader.Close();
              }
              stream.Close();
          }
          proxyResponse.Close();
      }
  }
  finally
  {
      proxyRequest.Abort();
  }
  </code></pre>
  
  <p>When I have set the timeout value to 5 seconds, I will receive a timeout exception after 5 seconds just as one would expect. This proves the Timeout value isn't being completely ignored. </p>
  
  <p>Has anybody else run into this issue? Will using the Async version of GetResponse get around this issue? Any and all thoughts welcome, I've been stuck on this for a couple days.</p>
  
  <p><strong>UPDATE</strong></p>
  
  <p>I can get the POST to respect the timeout value if I don't post any data (which isn't very useful). However, as soon as I post any data at all and ContentLength is > 0, it timesout at 100 seconds. Also, no proxies are involved.</p>
  
  <p><strong>UPDATE 2</strong></p>
  
  <p>Added the POST data to the example and a comment on where NOT to set the Timeout property</p>