【问题标题】:Retry on exception code is not actually retrying重试异常代码实际上并没有重试
【发布时间】:2014-05-03 03:22:20
【问题描述】:

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

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

它叫Retry.Do(() =&gt; HttpReturnJson(request), TimeSpan.FromSeconds(15), 3);

这就是我的HttpReturnJson 的样子:

EDITED 我尝试将 WebResponseStreamReader 包含在 using 块内...似乎不是 old 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?

【问题讨论】:

    标签: c# http httprequest httpresponse


    【解决方案1】:

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

    下面是您的HttpReturnJson 重新创建请求的样子(假设只是在已知 url 上进行常规 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;
        }
    }
    

    请注意,如果您需要 headers/post 数据,您也需要在每个请求中设置它们。

    【讨论】:

    • 如何发送新请求? HttpWebRequest 对象保持不变。
    • @KKKKKKKK - 我已经添加了HttpReturnJson 更改的示例...作为“重新发送请求”,我的意思是创建新的WebRequest - 应该更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多