Если Вы пишете свой код в emacs тогда, Вы могли бы интересоваться пакет htmlize elisp.
Это означает то, что написано. Операция длилась слишком долго.
Кстати, посмотрите WebRequest.Timeout , и вы увидите, что вы установили тайм-аут на 1/5 секунды .
]Я помню, что недавно при использовании WCF у меня была такая же проблема из-за большого количества данных, которые я передавал. Помню, я везде менял таймауты, но проблема не исчезла. В конце концов я открыл соединение как потоковый запрос, мне нужно было изменить клиентскую и серверную стороны, но это работает именно так. Поскольку это было потоковое соединение, сервер продолжал читать, пока поток не закончился.
Я не уверен насчет вашего первого примера кода, в котором вы используете WebClient.UploadValues, этого недостаточно, чтобы продолжить, не могли бы вы вставить больше окружающего кода? Что касается вашего кода WebRequest, здесь задействованы две вещи:
Вы запрашиваете только заголовки ответа **, вы никогда не читаете тело ответа, открывая и читая (до его конца) ResponseStream. Из-за этого клиент WebRequest услужливо оставляет соединение открытым, ожидая, что вы запросите тело в любой момент. Пока вы не прочитаете тело ответа до завершения (что автоматически закроет поток для вас), очистите и закроете поток (или экземпляр WebRequest) или не дождетесь, пока GC сделает свое дело, ваше соединение останется открытым.
По умолчанию у вас установлено максимальное количество активных подключений к одному и тому же хосту, равное 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 с сервером остается открытым до тех пор, пока вы не дойдете до конца этого потока (фактически закрывая его, поскольку он ' недоступен для поиска), закройте его вручную или утилизируйте. Подробнее об этом здесь .