1

我遇到的问题是,在重试请求后,我的 POST 数据不知何故丢失了。下面的代码示例。(请注意,request.timeout = 1 设置用于测试目的,以重现以下代码中显示的行为):

//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
            }
        }
    }

神奇的是第一个请求(直到请求超时错误)进展顺利。进一步的请求在没有POST 数据的情况下进行,但内容长度被正确计算(即与之前的请求保持相同)。


更新:

  1. post_data_final 获取是单独的功能。它没有被使用(除了 byteArray)或在 request_3() 函数中改变。
  2. 如果请求进入 for 循环并且没有发生超时异常,则请求工作正常。因此,如果我只是将我的请求放入 for 循环中,它将执行特定数量的有效请求。一旦我收到超时异常,下一个请求将没有 POST 数据。
  3. 源代码是为那些认为递归是一个坏主意的人编辑的。编辑后的代码仍然不起作用。

任何建议表示赞赏

4

2 回答 2

0

如评论所述,我在您的代码中找不到任何错误,因此请提供模式详细信息。

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;
         }
    }
}
于 2013-11-11T17:18:50.460 回答
0

问题是因为使用了 Fiddler2 - Wireshark 的类似物(即拦截交通工具)。

请求的站点使用 https 协议。出于调试目的,我安装了 Fiddler2 和 Fiddler2 证书,以便能够查看所有传入和传出的响应。出于某种神奇的原因,当我关闭 Fiddler2 并向控制台添加一些额外的登录时,我发现请求似乎是有效的(即第一次请求后 POST 正文数据仍然存在)。

因此,当我们遇到超时异常时,上面的 Fiddler2 代码不起作用。如果没有 Fiddler2,在相同的情况下并使用相同的代码,一切都可以正常工作。

我没有深入研究 Fiddler2,但在我看来,问题可能仅与 VS2010 的兼容性和错误代码的内部代理有关(考虑到在“更新”区域下使用第 2 点(那里也使用了 Fiddler2)以获得成功代码(即 2xx - 3xx)工作正常)

感谢大家对此的关注。

于 2013-11-11T18:25:28.253 回答