Как выполнить быстрый веб-запрос в C # - PullRequest
28 голосов
/ 13 июля 2009

У меня есть API на основе HTTP, который мне потенциально нужно вызывать много раз. Проблема в том, что я не могу получить запрос менее чем за 20 секунд, хотя тот же запрос, сделанный через браузер, почти мгновенный. Следующий код иллюстрирует, как я реализовал это до сих пор.

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla");
var response = r.GetResponse();

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

Обновление:

Выполнение следующего кода заняло около 40 секунд в режиме разблокировки (измерено с помощью секундомера):

WebRequest g = HttpWebRequest.Create("http://www.google.com");
var response = g.GetResponse();

Я работаю в университете, где в конфигурации сети могут быть разные вещи, влияющие на производительность, но прямое использование браузера показывает, что оно должно быть почти мгновенным.

Обновление 2:

Я загрузил код на удаленную машину, и он работал нормально, поэтому следует сделать вывод, что код .NET делает что-то дополнительное по сравнению с браузером или имеет проблемы с разрешением адреса через университетскую сеть (проблемы с прокси-сервером или что-то в этом роде ?! ).

Ответы [ 4 ]

30 голосов
/ 07 сентября 2010

Эта проблема похожа на другой пост в StackOverflow: Stackoverflow-2519655 (HttpWebrequest очень медленный)

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

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}
13 голосов
/ 23 февраля 2011

У меня была 30-секундная задержка при «первой» попытке - ссылка Джеймса на другой пост с упоминанием установки прокси в ноль решила это мгновенно!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url);
request.Proxy = null; // <-- this is the good stuff

...

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
3 голосов
/ 13 июля 2009

Есть ли у вашего сайта недействительный сертификат SSL? Попробуйте добавить это

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept);

//... somewhere AlwaysAccept is defined as:

using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}
2 голосов
/ 12 августа 2013

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

using (var response = g.GetResponse())
{
    // do stuff with your response
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...