2017-06-16 83 views
0

我正在通過HttpWebRequest從遠程服務讀取數據。接收到的JSON消息暫時存儲爲List(Of Customer),隨後使用Dapper將其插入到Azure SQL中的表中。應用程序以Azure App Service中託管的.Net Framework 4.6.2作爲ASP.NET運行。所以這是兩個步驟:SQL插入(Dapper)後執行一次HttpWebRequest超時

A.採用小巧玲瓏的獲取通過HTTP請求和存儲數據爲List(Of Customer)

B.插入List(Of Customer)到客戶表中的SQL Azure中。

下獲得通過HTTP請求和存儲數據的List(Of Payment)

D.插入List(Of Payment)到Azure的付款表:

,直到我嘗試閱讀並插入另一組在相同的過程數據也能正常工作SQL使用Dapper。

問題:第二個HTTP請求(步驟C)總是超時。我做了多個測試。這裏是我的觀察:

  1. 這兩個HTTP請求通常需要2到3秒才能完成獨立執行。
  2. 將步驟的順序更改爲A,C,B,D完美地工作。多個後續請求A,C,A,C ...也可以工作。這證明沒有遠程服務器問題。
  3. HTTP請求超時僅在前面插入SQL時纔會出現。
  4. 我已經將A + B分成一個函數,將C + D分隔到另一個函數中,並通過兩個單獨的按鈕通過GUI觸發它們。超時時間到了。
  5. 當C + D在A + B之後執行,但延遲1 - 2分鐘時,一切正常。似乎在步驟A + B中插入的數據越少,爲了正確執行就需要C + D的較小延遲。
  6. 執行A + B後,對同一臺服務器的任何其他HTTP請求(與A)都會超時,即使請求的URL不存在。如果另一個HTTP請求是通過同一瀏覽器窗口觸發的,另一個甚至是來自其他PC(不同的asp.net會話)觸發無關緊要。
  7. 一旦前面提到的任何其他HTTP請求被取消(觸發它的瀏覽器窗口將被關閉或重定向到其他頁面)而無需等待超時,並且無需延遲1 - 2分鐘,C + D就可以正常工作。甚至在幾秒鐘後觸發。只有第一次請求超時。
  8. 我試圖增加ServicePoint.ConnectionLimitSystem.Net.ServicePointManager.DefaultConnectionLimit但是他們已經被設置爲Int32.MaxValue

這表明SQL插入和隨後的HTTP請求之間的一些鏈路。然而,這似乎很難相信,我會在像內存泄漏一些更普遍的問題,等等。

編輯點:

試圖進一步調查。使用原始場景A + B + C + D,一旦第一個HTTP請求返回的行數有限,它就開始工作。最初的遠程服務返回了18.000行。看起來像10.000是數字,當它開始工作(一些執行仍然錯誤地運行)。在步驟中有9.000行代碼運行時沒有任何問題。在步驟B中插入自然SQL需要更少的時間。

+0

它似乎是控制數據最大大小的Web服務的安全權限。聯繫可以在web.config中修改這些參數的web管理員。 –

+0

不能同意,因爲一旦跳過數據庫插入,可以從遠程服務器讀取數據,沒有任何問題。看我的觀察沒有。 2. – Megrez7

回答

0

設置HttpWebRequest.KeepAlive = False用於步驟A和C中的Web服務請求解決了該問題。

但仍然不知道爲什麼它有幫助,以及潛在問題的原因是什麼。

+0

但你有一個領導。這是一個錯誤嗎?你錯過了微妙的細微差別嗎? –

+0

@clifton_h絕對是的。試圖找出更多的時刻。任何建議如何調試它? – Megrez7