WebClient.DownloadData 迁移到 AWS 后服务器超时

WebClient.DownloadData times out on server after moving to AWS

在我多年前用 C# 开发的 ASP.NET MVC webapp 中,有一个动作/控制器下载 Google 地图的图像并将其保存到磁盘以备后用,使用 WebClient.DownloadData.

此操作/控制器每天被请求 4 或 5 次。此 Web 应用程序(以及操作/控制器)在开发和生产中完美运行(内部服务器,Windows Server 2008 R2 Foundation,IIS 7.5,.NET Framework v4.0)。

最近,该应用程序已移至 AWS 中的新虚拟服务器(Windows Server 2019 Datacenter、IIS 10、.NET CLR v4.0)。除了我之前提到的操作/控制器之外,整个网络应用程序似乎工作正常。

如果我使用安装在新虚拟服务器中的 chrome 中的 URL,则地图下载没有问题。但是当请求动作/控制器时它超时(异常):

代码很简单:

string url = "http://maps.googleapis.com/maps/api/staticmap?key=[API_KEY]&center=" + lat + "," + long + "&size=355x255&markers=color:red|" + lat + "," + long;
WebClient web = new WebClient();
byte[] bs = web.DownloadData(url);
// save bs in disk

这是应该下载的地图示例

http://maps.googleapis.com/maps/api/staticmap?key=[API_KEY]&center=25.670984,-100.285016&size=355x255&markers=color:red|25.670984,-100.285016

我检查了 WebClient.DownloadData 文档,但没有发现任何可能导致问题的提示。

同样,这个动作/控制器多年来一直运行良好,但在迁移之后它开始失败。


更多信息


我构建了一个仅包含下一个代码的控制台应用程序(使用不同的 API_KEYs 没有限制):

WebClient web = new WebClient();
byte[] bs = web.DownloadData("http://maps.googleapis.com/maps/api/staticmap?key=API_KEY&center=25.670984,-100.285016&size=355x255&markers=color:red|25.670984,-100.285016");
File.WriteAllBytes("mapa.jpg", bs);

并且仍然出现超时异常。

然后,我安装了 mitmproxy 来监控流量(可能是网络问题?),效果很好。

使用代理的代码(将 https 更改为 http):

WebClient web = new WebClient();
WebProxy proxy = new WebProxy("127.0.0.1", 8080);
byte[] bs = web.DownloadData("http://maps.googleapis.com/maps/api/staticmap?key=API_KEY&center=25.670984,-100.285016&size=355x255&markers=color:red|25.670984,-100.285016");
File.WriteAllBytes("mapa.jpg", bs);

但我不能让 mitmproxy 运行 一直在服务器中,有些东西仍然关闭。

发现问题:是服务器的默认代理。

多亏了这个问题 找到了解决方案。

WebClient webclient = new WebClient();
webclient.Proxy = null;

根据WebClient.Proxy Property documentation:

The proxy is set by the system using configuration files and the Internet Explorer Local Area Network settings. To specify that no proxy should be used, set the Proxy property to null.

并且服务器 (AWS) 的默认代理不允许我尝试执行的请求。

现在,因为我无法修改 webapp (action/controller) 中的代码(现在),所以我不得不搜索 How to disable proxy server via web.config file 并且成功了。

<system.net>
  <defaultProxy>
    <proxy usesystemdefault="False"/>
  </defaultProxy>
</system.net>

很明显,该值是“True”并将其更改为“False”。