Я пользуюсь библиотекой с открытым исходным кодом для соединения с моим веб-сервером. Я был обеспокоен, что веб-сервер чрезвычайно не торопился, и затем я пытался делать простой тест в Ruby, и я получил эти результаты
Программа Ruby: 2,11 секунды для 10 HTTP ДОБИРАЮТСЯ
Программа Ruby: 18,13 секунд для 100 HTTP ДОБИРАЮТСЯ
Библиотека C#: 20,81 секунды для 10 HTTP ДОБИРАЮТСЯ
Библиотека C#: 36 847,46 секунд для 100 HTTP ДОБИРАЮТСЯ
Я представил и нашел, что проблема эта функция:
private HttpWebResponse GetRawResponse(HttpWebRequest request) {
HttpWebResponse raw = null;
try {
raw = (HttpWebResponse)request.GetResponse(); //This line!
}
catch (WebException ex) {
if (ex.Response is HttpWebResponse) {
raw = ex.Response as HttpWebResponse;
}
}
return raw;
}
Отмеченная строка, принимает 1 секунду для завершения отдельно, в то время как рубиновая программа, выполняющая 1 запрос, занимает.3 секунд. Я также делаю все эти тесты на 127.0.0.1, таким образом, сетевая пропускная способность не является проблемой.
Что могло вызывать, это огромное замедляется?
ОБНОВЛЕНИЕ
Проверьте измененные результаты сравнительного теста. Я на самом деле протестировал с 10, ДОБИРАЕТСЯ а не 100, я обновил результаты.
Я обнаружил, что основной причиной медленных веб-запросов является свойство прокси. Если установить для этого свойства значение null до вызова метода GetResponse, запрос пропустит этап автоопределения прокси-сервера:
request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}
Автоопределение прокси-сервера занимало до 7 секунд, прежде чем возвращать ответ. Немного раздражает, что это свойство установлено по умолчанию для объекта HttpWebRequest.
Используйте компьютер, отличный от localhost , затем используйте WireShark , чтобы увидеть, что на самом деле происходит по сети.
Как говорили другие, это может быть несколько вещей. Взгляд на вещи на уровне TCP должен дать ясную картину.
Это может быть связано с тем, что вы открываете несколько подключений одновременно. По умолчанию максимальное количество открытых HTTP-соединений установлено на два. Попробуйте добавить это в свой файл .config и посмотрите, поможет ли это:
<system.net>
.......
<connectionManagement>
<add address="*" maxconnection="20"/>
</connectionManagement>
</system.net>