Подтвердить что ты не робот

Как выполнить быстрый веб-запрос в С#

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

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

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

Update:

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

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

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

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

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

4b9b3361

Ответ 1

Эта проблема похожа на другую запись в StackOverflow: fooobar.com/questions/87071/...

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

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}

Ответ 2

У меня была 30-секундная задержка при попытке "первой" - ссылка Джеймса на другое сообщение, в котором упоминается, что параметр-прокси для нулевого решения мгновенно устранен!

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

...

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Ответ 3

Имеется ли у вашего сайта недопустимый сертификат 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;
}

Ответ 4

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

using (var response = g.GetResponse())
{
    // do stuff with your response
}