我使用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上更改某种超时(可能更短)修复它吗?应该是什么价值?
添加异常处理以重试请求?
答案 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);
}
}
}
}
查看审计,它永远不必重试多次。我的理解是,保持连接在某个时刻被远程端关闭,下次我尝试在我的端部发送数据时,我立即失败,我的端连接关闭,重试打开一个新的连接。