简体   繁体   中英

Retrying POST request loses body c# winforms

I faced with the issue that after retrying the request my POST data got lost somehow. Code sample below. ( Please note that request.timeout = 1 set for testing purposes to reproduce the behavior shown in the code below ):

//post_data_final getting

private void request_3()
    {
        for(int i=1; i<=5; i++)
        {
            byte[] byteArray = Encoding.ASCII.GetBytes(post_data_final);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(site_URI);
            request.Method = "POST";
            //some headers info
            request.Timeout = 1;
            request.ContentLength = byteArray.Length;
            using (Stream os = request.GetRequestStream())
            {
                os.Write(byteArray, 0, byteArray.Length);
            }
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                //some code about response
            }
            catch (WebException wex) 
            {
                if (wex.Status == WebExceptionStatus.Timeout)
                {
                    continue;
                }
                //some additional checks
            }
        }
    }

The magic is that first request (until Request timeout error) goes well. Further requests are going without POST data, but content length is counted properly (ie stays the same as in previous request).


Updated:

  1. post_data_final getting is separate function. It is not used (except byteArray) or changed in request_3() function.
  2. Request works fine if it got into for loop and Timeout exception has not occured . So if I just put my request into for loop it will do particular number of valid requests. As soon as I'm getting Timeout exception, the next request will be without POST data.
  3. Source code is edited for those who thinks that recursion is a bad idea. The edited code still doesn't work.

Any suggestions are appreciated

I cant find anything wrong in your code, so provide mode details, as the comments mentioned.

private void request_3()
{
    bool sendData = true;
    int numberOfTimeOuts = 0;

    // The follwing only needs to be done only once, unless you alter post_data_final after each timeout.
    byte[] dataToSend = Encoding.ASCII.GetBytes(post_data_final);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(site_URI);
    using (Stream outputStream = request.GetRequestStream())
        outputStream.Write(dataToSend, 0, dataToSend.Length);



    // request.TimeOut = 1000 * 15; would mean 15 Seconds.

    while(sendData && numberOfTimeOuts < MAX_NUMBER_OF_TIMEOUTS)
    {
         try
         {
             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
             if(response != null)
                 processResponse(response);
             else
             {
                 //You should handle this case aswell.
             }

             sendData = false;
         }
         catch(WebException wex)
         {
             if (wex.Status == WebExceptionStatus.Timeout)
                 numberOfTimeOuts++;
             else
                 throw;
         }
    }
}

The issue was because of using Fiddler2 - analogue of Wireshark (ie intercepting traffic tool).

Requested site uses https protocol. For debugging purposes I installed Fiddler2 and Fiddler2 certificate to be able to see all incoming and outcoming responses. For some magic reason when I turned off Fiddler2 and added some additional logging into console, i figured out that requests are appeared to be valid (ie POST body data still exists after first request).

So with Fiddler2 code above doesn't work while we're having Timeout exception. Without Fiddler2 everything works fine under the same circumstances and using the same code.

I didn't dig deep into Fiddler2, but seems to me issue could be only with compatibility of VS2010 and internal proxy for Error Codes (taking into account that using point 2 under "Updates" area (The Fiddler2 was also used there) for success codes (ie 2xx - 3xx) worked fine)

Thanks everyone for getting attention into this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM