2016-12-20 13 views
0

私はそれに多くのHttpWebRequestコールを持つプログラムを持っています。さまざまなストリーミングプラットフォーム(Twitch、Hitbox、Beam、YouTube)への外部APIリクエストを多く扱っています。すべての私の要求はうまくいくようです。ここで.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でabortを呼び出すことができます。また、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); 
     } 
    } 
関連する問題