GOOGLE ADS

Mittwoch, 20. April 2022

WebClient.DownloadData-Zeitüberschreitung auf dem Server nach dem Wechsel zu AWS

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):

Ausnahme

Der Code ist einfach:

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

Dies ist ein Beispiel für eine Karte, die heruntergeladen werden sollte

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

statische Karte

Ich habe die Dokumentation überprüft WebClient.DownloadDataund 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&center=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&center=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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...