2014-10-02 79 views
1

我使用C#WebClient连接到Firebase REST API。示例:连接到Firebase的高负载WebClient错误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

如果您共享代码的最小片段来重现问题,它会有所帮助。 – 2014-10-02 19:56:12

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2014-10-02 20:24:35

+0

有很多原因会导致这种情况发生,比如服务器重新启动,服务器崩溃,网络暂时分区等等。您是否在问什么时候需要做什么? – 2014-10-02 20:27:07

回答

1

我代替我的电话给WebClient.UploadString()与我自己的UploadString(下文)重试失败/关闭的连接高达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); 
      } 
     } 
    } 
} 

纵观审计,它永远不会有重试一次以上。我的理解是,保持连接的连接在某个时候被远程终端关闭,下次尝试在我的终端上发送数据时,我立即失败,终端上的连接关闭,重新尝试打开一个新的连接。

+0

我不认为Firebase目前对REST API应用(记录)**速率限制**,但您可能希望查看与此相关的状态代码。出于这个原因,在没有延迟的情况下重试通常不会改善呼叫失败的问题。 – 2014-10-03 17:59:24