In einer ASP.NET MVC-Webanwendung, die ich vor Jahren in C# entwickelt habe, gibt es eine Aktion/einen Controller, der ein Bild von Google Maps herunterlädt und es zur späteren Verwendung auf der Festplatte speichert, indem er WebClient.DownloadData
.
Diese Aktion / dieser Controller wird 4 oder 5 Mal am Tag angefordert. Diese Web-App (und die Action/Controller) funktionierte in Entwicklung und Produktion einwandfrei (eigener Server, Windows Server 2008 R2 Foundation, IIS 7.5,.NET Framework v4.0).
Kürzlich wurde die App auf einen neuen virtuellen Server in AWS verschoben (Windows Server 2019 Datacenter, IIS 10,.NET CLR v4.0). Die gesamte Web-App scheint gut zu funktionieren, mit Ausnahme der Aktion / des Controllers, die ich zuvor erwähnt habe.
Wenn ich die URL in Chrome verwende, die auf dem neuen virtuellen Server installiert ist, wird die Karte ohne Probleme heruntergeladen. Aber wenn die Aktion / der Controller angefordert wird, läuft die Zeit ab (Ausnahme):
Der Code ist einfach:
string url = "http://maps.googleapis.com/maps/api/staticmap?key=[API_KEY]¢er=" + lat + "," + long + "&size=355x255&markers=color:red|" + lat + "," + long;
WebClient web = new WebClient();
byte[] bs = web.DownloadData(url);
// save bs in disk
Dies ist ein Beispiel für eine Karte, die heruntergeladen werden sollte
http://maps.googleapis.com/maps/api/staticmap?key=[API_KEY]¢er=25.670984,-100.285016&size=355x255&markers=color:red|25.670984,-100.285016
Ich habe die Dokumentation überprüft WebClient.DownloadData
und keinen Hinweis darauf gefunden, was das Problem verursachen kann.
Auch diese Aktion / dieser Controller funktionierte jahrelang einwandfrei, aber nach der Migration begann es zu versagen.
Mehr Info
Ich baue eine Konsolenanwendung, die nur den nächsten Code enthält (unter Verwendung verschiedener API_KEYs ohne Einschränkungen):
WebClient web = new WebClient();
byte[] bs = web.DownloadData("http://maps.googleapis.com/maps/api/staticmap?key=API_KEY¢er=25.670984,-100.285016&size=355x255&markers=color:red|25.670984,-100.285016");
File.WriteAllBytes("mapa.jpg", bs);
Und habe immer noch eine Timeout-Ausnahme.
Dann habe ich mitmproxy installiert, um den Datenverkehr zu überwachen (vielleicht war es ein Problem mit dem Netzwerk?) und es hat perfekt funktioniert.
Code mit dem Proxy (geändert https zu 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¢er=25.670984,-100.285016&size=355x255&markers=color:red|25.670984,-100.285016");
File.WriteAllBytes("mapa.jpg", bs);
ABER ich kann mitmproxy nicht die ganze Zeit auf dem Server laufen lassen, irgendwas ist immer noch aus.
Lösung des Problems
Problem gefunden: war der Standard-Proxy des Servers.
Dank dieser Frage How to bypass the system proxy when using WebClient war der Weg zur Lösung da.
WebClient webclient = new WebClient();
webclient.Proxy = null;
Gemäß der WebClient.Proxy-Eigenschaftsdokumentation:
Der Proxy wird vom System mithilfe von Konfigurationsdateien und den Einstellungen des lokalen Netzwerks von Internet Explorer festgelegt. Um anzugeben, dass kein Proxy verwendet werden soll, legen Sie die Proxy-Eigenschaft auf null fest.
Und der Standard-Proxy des Servers (AWS) lässt die Anfrage, die ich ausführen wollte, nicht zu.
Da ich den Code (im Moment) in der Webapp (Aktion/Controller) nicht ändern kann, musste ich suchen, wie der Proxy-Server über die Datei web.config deaktiviert werden kann, und es hat funktioniert.
<system.net>
<defaultProxy>
<proxy usesystemdefault="False"/>
</defaultProxy>
</system.net>
Offensichtlich war der Wert "True" und wurde auf "False" geändert.
Keine Kommentare:
Kommentar veröffentlichen