2016-12-24 91 views
1

所以,我有一個奇怪的問題。 我有一個運行自託管的OWIN API服務器的Azure工作者角色。這個工作者角色有2個實例(即:它是一個農場)。與這些實例的通信是通過SSL/443進行的,並且由負載平衡器後面的Azure進行輪迴處理。WebRequest.Create忽略我的循環網絡場

我在現場有數百個客戶端,每分鐘都與該工作者角色通信並向其發送數據。每隔一段時間(比如每天說一次),我的一個工作者角色實例重新啓動(我們稱之爲實例「A」)。重新啓動需要3-4分鐘,並且在重新啓動時,我的所有客戶端都切換到啓動並運行「B」的實例。這很好。 「A」實例重新啓動後會發生什麼情況並不好。沒有新的請求到達「A」實例,每個客戶端都「卡住」未重啓的「B」實例。我最終有2個負載平衡的服務器,其中一個運行在1%的CPU和另一個在60%的CPU上。我懷疑問題在於我的客戶端連接到我的工作者角色的方式。這是代碼。我究竟做錯了什麼? WebRequest.Create()是一個問題嗎?我需要切換到不同的客戶端嗎?哪一個?

TIA

 private string PostData(BearerToken token, Guid accountId, string path, object input) 
    { 
     var url = _apiUrl + path; 
     try 
     { 
      var client = WebRequest.Create(url); 
      client.Headers.Add("Authorization", string.Format("Bearer {0}", token.AccessToken)); 
      client.Headers.Add("AccountId", accountId.ToString()); 
      client.Method = "POST"; 
      client.Timeout = 120000; 
      client.ContentType = "application/json"; 

      var data = JsonConvert.SerializeObject(input); 

      using (var stream = client.GetRequestStream()) 
      using (var writer = new StreamWriter(stream)) 
      { 
       writer.Write(data); 
       writer.Flush(); 
       writer.Close(); 
       using (var response = client.GetResponse()) 
       { 
        using (var read = response.GetResponseStream()) 
        { 
         if (read == null) return string.Empty; 

         using (var reader = new StreamReader(read)) 
         { 
          return reader.ReadToEnd(); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(string.Format("{0} ({1})", ex.Message, url), ex); 
     } 
    } 

回答