Как отключить автоматическое определение прокси в объекте `AmazonS3`? - PullRequest
7 голосов
/ 23 января 2012

При первом использовании объекта AmazonS3 после запуска приложения, большая задержка составляет около 14 секунд.Эта большая задержка не присутствует для всех последующих вызовов.

Ранее я сталкивался с этой проблемой точной задержки с другими связанными классами HTTP, и она возникает, когда рассматриваемый класс пытается определить настройки прокси-сервера локальной машины ииспользовать их или нет.

Чтобы этого не случилось с WebClient, вы устанавливаете WebClient.Proxy = null;, и он не пытается автоматически определить настройки прокси, но я не могу понять, как отключить проксиобнаружение объекта AmazonS3.

Я специально пытался установить ProxyHost в null:

_s3Client = AWSClientFactory.CreateAmazonS3Client(awsAccessKey, awsSecretAccessKey, new AmazonS3Config { ProxyHost = null });

, который не работал.В настоящее время мы используем Amazon .NET SDK «v1.3.17.0».

Есть ли способ отключить обнаружение прокси?

1 Ответ

6 голосов
/ 23 января 2012

Хороший вопрос - я не пробовал сам, а только проанализировал код, но AmazonS3Config Class использует закрытый метод configureWebRequest(), который, в свою очередь, опирается на WebRequest Class для обработки фактического HTTP-соединения.Теперь WebRequest имеет свойство WebRequest.DefaultWebProxy , которое является public static (т.е. вы можете установить это в своем приложении перед вызовом CreateAmazonS3Client(()):

Свойство DefaultWebProxy получает или устанавливает глобальный прокси .Свойство DefaultWebProxy определяет прокси-сервер по умолчанию, который используется всеми экземплярами WebRequest , если запрос поддерживает прокси-серверы, и прокси-сервер не задан явно с помощью свойства Proxy. [emphasis mine]

Автоматическое обнаружение прокси, которое вы испытываете, предположительно вызвано соответствующим поведением IE:

Свойство DefaultWebProxy считывает настройки проксииз файла app.config.Если файл конфигурации отсутствует, используются настройки прокси-сервера текущего пользователя Internet Explorer (IE).

Следовательно, я надеюсь, что это можно отключить так же, как и для WebClientСвойство .Proxy , которое вы упомянули, хотя и на уровне класса, как действительно настоятельно рекомендуется в последнем абзаце:

Если для свойства DefaultWebProxy установлено значение null, для всех последующих экземпляровКласс WebRequest , созданный методами Create или CreateDefault , не имеет прокси . [выделено мной]


Добавлено blexandre

Пример кода из этого ответа будет

System.Net.WebRequest.DefaultWebProxy = null;
_s3Client = AWSClientFactory.CreateAmazonS3Client(awsAccessKey, awsSecretAccessKey);

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

...