2016-12-20 23 views
0

我有一个程序,其中有很多HttpWebRequest调用。它处理很多外部API请求到各种流媒体平台(Twitch,Hitbox,Beam,YouTube)。我的所有请求似乎都正常工作。.NET HttpWebRequest超时杀死所有未来的请求?

这里是我的请求之一的例子:

private void save_Click(object sender, RoutedEventArgs e) 
{ 
    string postUrl = "https://api.twitch.tv/kraken/channels/" + this.channelID; 
    string postData = "channel[status]=" + Uri.EscapeDataString(status.Text) + 
     "&channel[game]=" + Uri.EscapeDataString(game.Text); 
    byte[] postByte = Encoding.UTF8.GetBytes(postData); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); 

    request.Method = "PUT"; 
    request.Accept = "application/vnd.twitchtv.v5+json"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = postByte.Length; 
    request.Headers.Add("Authorization", "OAuth " + password.Password); 
    request.Headers.Add("Client-ID", this.clientID); 
    request.Timeout = 15000; 

    try 
    { 
     Stream putStream = request.GetRequestStream(); 
     putStream.Write(postByte, 0, postByte.Length); 
     putStream.Close(); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    } 
    catch (WebException err) 
    { 
     MessageBox.Show("Unable to update channel information:\n" + err.Message); 
    } 
} 

然而,有一个问题,如果一个请求失败(如瞬时互联网打嗝),并在try-catch一个错误响应由于超时,然后没有未来的HttpWebRequests将工作,直到我重新启动我的程序。

只有在错误捕获由超时启动时才会发生这种情况。

发生这种情况是否有原因,我该如何解决?

+0

我有与HttpClient相同的问题,这里的答案没有帮助。 – jsgoupil

回答

1

这很可能是由未正确释放导致锁定的资源引起的。

将代码更改为可能调用WebException上的HttpWebRequest上的异常终止,也可能将HttpWebResponse和putStream包装在using语句中。

private void save_Click(object sender, RoutedEventArgs e) 
    { 
     string postUrl = "https://api.twitch.tv/kraken/channels/" + this.channelID; 
     string postData = "channel[status]=" + Uri.EscapeDataString(status.Text) + 
      "&channel[game]=" + Uri.EscapeDataString(game.Text); 
     byte[] postByte = Encoding.UTF8.GetBytes(postData); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); 

     request.Method = "PUT"; 
     request.Accept = "application/vnd.twitchtv.v5+json"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = postByte.Length; 
     request.Headers.Add("Authorization", "OAuth " + password.Password); 
     request.Headers.Add("Client-ID", this.clientID); 
     request.Timeout = 15000; 

     try 
     { 
      using (Stream putStream = request.GetRequestStream()) 
      { 
       putStream.Write(postByte, 0, postByte.Length); 
       using (var response = (HttpWebResponse) request.GetResponse()) 
       { 
        //assign the response result to a variable else it's getting disposed 
       } 
      } 
     } 
     catch (WebException err) 
     { 
      request.Abort(); 
      MessageBox.Show("Unable to update channel information:\n" + err.Message); 
     } 
    }