2016-12-24 109 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); 
     } 
    } 

回答