C# .NET HttpWebRequest超时是否会终止所有未来的请求?

C# .NET HttpWebRequest超时是否会终止所有未来的请求?,c#,.net,httpwebrequest,C#,.net,Httpwebrequest,我有一个程序,里面有很多HttpWebRequest调用。它大量处理对各种流媒体平台(Twitch、Hitbox、Beam、YouTube)的外部API请求。我所有的要求似乎都很有效 以下是我的一个请求的示例: private void save_Click(object sender, RoutedEventArgs e) { string postUrl = "https://api.twitch.tv/kraken/channels/" + this.channelID;

我有一个程序,里面有很多
HttpWebRequest
调用。它大量处理对各种流媒体平台(Twitch、Hitbox、Beam、YouTube)的外部API请求。我所有的要求似乎都很有效

以下是我的一个请求的示例:

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);
    }
}
但是,有一个问题是,如果请求失败(例如短暂的internet打嗝),并且try-catch由于超时而响应错误,那么在我重新启动程序之前,未来的HttpWebRequests将无法工作

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


发生这种情况的原因是什么?我如何修复它?

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

将代码更改为可能在HttpWebRequestonWebException上调用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);
        }
    }

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

将代码更改为可能在HttpWebRequestonWebException上调用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);
        }
    }

我对HttpClient也有同样的问题,这里的答案没有帮助。我对HttpClient也有同样的问题,这里的答案没有帮助。