Система. Сеть. WebException: операция испытала таймаут

Если Вы пишете свой код в emacs тогда, Вы могли бы интересоваться пакет htmlize elisp.

26
задан Alex McMillan 23 February 2017 в 19:33
поделиться

4 ответа

Это означает то, что написано. Операция длилась слишком долго.

Кстати, посмотрите WebRequest.Timeout , и вы увидите, что вы установили тайм-аут на 1/5 секунды .

]
32
ответ дан 28 November 2019 в 06:10
поделиться

Я помню, что недавно при использовании WCF у меня была такая же проблема из-за большого количества данных, которые я передавал. Помню, я везде менял таймауты, но проблема не исчезла. В конце концов я открыл соединение как потоковый запрос, мне нужно было изменить клиентскую и серверную стороны, но это работает именно так. Поскольку это было потоковое соединение, сервер продолжал читать, пока поток не закончился.

0
ответ дан 28 November 2019 в 06:10
поделиться

Я не уверен насчет вашего первого примера кода, в котором вы используете WebClient.UploadValues, этого недостаточно, чтобы продолжить, не могли бы вы вставить больше окружающего кода? Что касается вашего кода WebRequest, здесь задействованы две вещи:

  1. Вы запрашиваете только заголовки ответа **, вы никогда не читаете тело ответа, открывая и читая (до его конца) ResponseStream. Из-за этого клиент WebRequest услужливо оставляет соединение открытым, ожидая, что вы запросите тело в любой момент. Пока вы не прочитаете тело ответа до завершения (что автоматически закроет поток для вас), очистите и закроете поток (или экземпляр WebRequest) или не дождетесь, пока GC сделает свое дело, ваше соединение останется открытым.

  2. По умолчанию у вас установлено максимальное количество активных подключений к одному и тому же хосту, равное 2. Это означает, что вы израсходуете свои первые два подключения, а затем никогда не избавитесь от них, поэтому у вашего клиента не будет возможности завершите следующий запрос до того, как он достигнет своего тайм-аута (который составляет миллисекунды, кстати, поэтому вы установили его на 0,2 секунды - по умолчанию все подойдет).

Если вам не нужна основная часть ответа (или вы вы только что загрузили или разместили что-то на POST и не ожидаете ответа), просто закройте поток или клиент, который закроет поток для вас.

Самый простой способ исправить это - убедиться, что вы используете using блоки на одноразовых объектах:

for (int i = 0; i < ops1; i++)
{
    Uri myUri = new Uri(site);
    WebRequest myWebRequest = WebRequest.Create(myUri);
    //myWebRequest.Timeout = 200;
    using (WebResponse myWebResponse = myWebRequest.GetResponse())
    {
        // Do what you want with myWebResponse.Headers.
    } // Your response will be disposed of here
}

Другое решение - разрешить 200 одновременных подключений к одному и тому же хосту. Однако, если вы не планируете выполнять эту операцию в многопоточном режиме, чтобы вы d требуется несколько одновременных подключений, это вам не поможет:

 ServicePointManager.DefaultConnectionLimit = 200;

Когда вы получаете тайм-аут в коде, лучше всего попытаться воссоздать этот тайм-аут вне вашего кода. Если вы не можете, возможно, проблема в вашем коде. Я обычно использую для этого cURL или просто веб-браузер, если это простой запрос GET.

** На самом деле вы фактически запрашиваете первый фрагмент данных из ответа, который содержит Заголовки HTTP, а также начало тела. Вот почему можно прочитать информацию заголовка HTTP (например, Content-Encoding, Set-Cookie и т. Д.) Перед чтением из выходного потока. Когда вы читаете поток, с сервера извлекаются дальнейшие данные. Соединение WebRequest с сервером остается открытым до тех пор, пока вы не дойдете до конца этого потока (фактически закрывая его, поскольку он ' недоступен для поиска), закройте его вручную или утилизируйте. Подробнее об этом здесь .

26
ответ дан 28 November 2019 в 06:10
поделиться

Закройте / удалите объект WebResponse.

33
ответ дан 28 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: