如何在“AmazonS3”对象中关闭自动代理检测?

在应用程序启动后第一次使用AmazonS3对象时,会有大约14秒的大延迟。 所有后续呼叫都不存在这种大的时间延迟。

我之前遇到过这个与其他HTTP相关的类的确切延迟问题,并且当有问题的类试图确定本地机器的代理设置以及是否使用它们时,会导致它。

要阻止WebClient发生这种情况,请设置WebClient.Proxy = null; 并且它不会尝试自动检测代理设置,但我无法弄清楚如何禁用AmazonS3对象的代理检测function。

我特意尝试将ProxyHost设置为null

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

哪个没用。 我们目前正在使用Amazon .NET SDK“v1.3.17.0”。

有没有办法关闭代理检测?

好问题 – 我自己没有尝试过,只分析过代码,但AmazonS3Config类使用私有方法configureWebRequest() ,后者依赖WebRequest类来处理实际的HTTP连接。 现在, WebRequest有一个WebRequest.DefaultWebProxy属性 ,它是公共静态的 (即你可以在调用CreateAmazonS3Client(()之前在你的应用程序中设置它):

DefaultWebProxy属性获取或设置全局代理 。 DefaultWebProxy属性确定所有WebRequest实例在请求支持代理时使用的默认代理,并且未使用Proxy属性显式设置代理。 [强调我的]

您正在经历的代理自动检测据推测是由相应的IE行为引起的:

DefaultWebProxy属性从app.config文件中读取代理设置。 如果没有配置文件,则使用当前用户的Internet Explorer(IE)代理设置。

因此,我希望可以通过类似于您提到的WebClient.Proxy属性的方式禁用它,尽管在类级别上,正如最后一段强烈建议的那样:

如果DefaultWebProxy属性设置为null,则Create或CreateDefault方法创建的WebRequest类的所有后续实例 都没有代理[强调我的]


由blexandre添加

这个答案的示例代码是

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

请注意 ,这将禁用每个Web请求的代理, _client是使用它创建的,因此可以安全地执行此操作,但是如果您可能有更多来自WebRequest类的请求,请务必小心