2014-10-02 78 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