连接到Firebase的高负载WebClient错误休息api

时间:2014-10-02 19:34:25

标签: c# rest firebase

我使用C#WebClient连接到Firebase REST API。样品:

using (WebClient webClient = new WebClient())
{
   webClient.UploadString(restUrl, "PATCH", jsonDataString);
}

在中等负载下它运行良好,但在某些时候我开始得到这个错误(错误是立即抛出,没有延迟/超时)

System.Net.WebException: The underlying connection was closed: 
A connection that was expected to be kept alive was closed by the server.

实时服务器上的许多请求都会出现此错误,但无法在测试环境中复制错误。 (与实时错误同时)似乎WebClient正在使用保持连接,并且在启动新请求时,它发现连接已经关闭,并抛出异常。

我该如何解决这个问题?

我可以尝试关闭保持活力,但这似乎效率低下。

可能会在WebClient上更改某种超时(可能更短)修复它吗?应该是什么价值?

添加异常处理以重试请求?

1 个答案:

答案 0 :(得分:1)

我通过调用我自己的UploadString(下面)替换了对WebClient.UploadString()的调用,该调用重试失败/关闭的连接,最多3x,记录失败的尝试,并在第3次尝试后静默失败。 (我可以在第3次失败后重新抛出错误,但出于我的目的,无声失败更好)

protected void UploadString(string address, string method, string data)
{
    using (WebClient webClient = new WebClient())
    {
        bool success = false;
        int tryCount = 0;

        while (!success && tryCount++ < 3)
        {
            try
            {
                webClient.UploadString(address, method, data);
                success = true;
            }
            catch (WebException)
            {
                Log.Audit(1, tryCount, address, method);
            }
        }
    }
}

查看审计,它永远不必重试多次。我的理解是,保持连接在某个时刻被远程端关闭,下次我尝试在我的端部发送数据时,我立即失败,我的端连接关闭,重试打开一个新的连接。