Тайм-аут с HttpWebResponse в .NET - PullRequest
0 голосов
/ 28 октября 2010

У меня есть следующий код, и после ~ 60 его вызовов (20 одновременных подключений) начинается тайм-аут.если я уменьшу время ожидания с 10 минут до 1 минуты, они начнут отсчитывать время ~ 34 загрузок.что дает?я знаю, что вы можете получить это, если вы не закроете свой ответ должным образом, но я определенно закрываю его:

    //===============================================================================
    /// <summary>
    /// Executes the request and returns the response as a byte array. Useful if the 
    /// response should return a file.
    /// </summary>
    private static byte[] GetResponse(HttpWebRequest webRequest)
    {
        //---- declare vars
        HttpWebResponse response = null;
        List<byte> buffer = new List<byte>();
        int readByte;

        //---- try to get the response, always wrap it.
        try
        { response = webRequest.GetResponse() as HttpWebResponse; }
        //---- catch all
        catch (Exception e)
        {
            if (response != null) { response.Close(); }
            throw new ConnectionFailedException("Failed to get a response", e);
        }

        try
        {
            //---- if the response is ok
            if (response.StatusCode == HttpStatusCode.OK)
            {
                //---- get the response stream
                using (Stream stream = response.GetResponseStream())
                {
                    //---- read each byte, one by one into the byte buffer
                    while ((readByte = stream.ReadByte()) > -1)
                    {
                        buffer.Add((byte)readByte);
                    }
                    //---- close the stream
                    stream.Close();
                    response.Close();
                }

                //---- return the buffer as a byte array
                return buffer.ToArray();
            }
            //---- if the request wasn't auth'd
            else if (response.StatusCode == HttpStatusCode.Forbidden || response.StatusCode == HttpStatusCode.Unauthorized)
            {
                if (response != null) { response.Close(); }
                throw new AuthenticationFailedException(response.StatusDescription);
            }
            //---- any other errors
            else
            {
                if (response != null) { response.Close(); }
                throw new ConnectionFailedException(response.StatusDescription);
            }
        }
        finally { if (response != null) { response.Close(); } }
    }
    //===============================================================================

мысли?

также я создаю его сTimeOut и ReadWriteTimeout установлены на 10 минут:

// ---- создаем веб-запрос HttpWebRequest webRequest = WebRequest.Create (url) как HttpWebRequest;

// ----установить 10-минутный тайм-аут webRequest.Timeout = 600000;webRequest.ReadWriteTimeout = 600000;

Ответы [ 4 ]

4 голосов
/ 29 октября 2010

System.Net.ServicePointManager.DefaultConnectionLimit = 200;

^^ сделано.

вот и все.

1 голос
/ 28 октября 2010

Как насчет упрощения вашего кода:

using (var client = new WebClient())
{
    byte[] result = client.DownloadData("http://example.com");
}
0 голосов
/ 28 октября 2010

Не проверено, но немного чище.

private static byte[] GetResponse(HttpWebRequest webRequest)
{
        using (var response = (HttpWebResponse)webRequest.GetResponse())
        {
            switch (response.StatusCode)
            {
                case HttpStatusCode.Forbidden:
                case HttpStatusCode.Unauthorized:
                    throw new AuthenticationFailedException(response.StatusDescription);
                    break;
                case HttpStatusCode.OK:
                    break; // to get through
                default:
                    throw new ConnectionFailedException(response.StatusDescription);
            }

            using (Stream stream = response.GetResponseStream())
            {
                // you should really create a large buffer and read chunks.
                var buffer = new byte[response.ContentLength];
                var bytesRead = 0;
                while (bytesRead < buffer.Length)
                {
                   var bytes = stream.Read(buffer, bytesRead, buffer.Length - bytesRead);
                   bytesRead += bytes;
                }

                return buffer;
            }

        }
}

Edit:

Изменено, чтобы при распределении буфера использовался ContentLength. Это всегда точно, если не используется чанкованное кодирование.

0 голосов
/ 28 октября 2010

Установите для свойства KeepAlive значение false с помощью:

webRequest.KeepAlive = false;

Освободите ресурс в операторе finally.

...