异常代码重试实际上并未重试

时间:2014-05-03 03:22:20

标签: c# http httprequest httpresponse

我有以下代码......在第一次迭代中,它查询服务器就好了。但是如果得到一个错误,return action()被调用,但Fiddler没有任何反应,并立即跳转到catch块。发生了什么事?

for (int retry = 0; retry < retryCount; retry++)
{
    try
    {
        return action();
    }
    catch (WebException ex)
    {
        // truncated for clarity
    }
}

它被称为Retry.Do(() => HttpReturnJson(request), TimeSpan.FromSeconds(15), 3);

这就是我HttpReturnJson的样子:

已编辑我尝试将WebResponseStreamReader封闭在using块内...它似乎不是 WebResponse response正在处理中。在重试时,我还在读旧的。如何在重试时重新发送request

public string HttpReturnJson(HttpWebRequest request)
{
    using (WebResponse response = request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        string data = reader.ReadToEnd();
        return data;
    }
}

此代码的来源: Cleanest way to write retry logic?

1 个答案:

答案 0 :(得分:2)

您不能多次读取相同的响应,因此您需要在每次重试时重新发送请求,而不是从响应中读取。

以下是您HttpReturnJson重新创建请求的方式(假设已知网址上的常规GET):

public string HttpReturnJson(string url)
{
    using (var request = WebRequest.Create(url))
    using (WebResponse response = request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        string data = reader.ReadToEnd();
        return data;
    }
}

请注意,如果您需要标题/发布数据,则需要在每次请求时都设置这些数据。