Dateigröße einer Datei auf dem Webserver abfragen

ruNN0r

Erfahrenes Mitglied
Hallo,

ich versuche gerade für meine Programme eine Updateroutine zu schreiben. Diese Fragt Internetseite nach einer neuen Version ab. Dort stehen dann auch Instruktionen (z.B. Welche Datei runtergeladen werden muss).

Nun sammel ich alle Instruktionen bzw. Dateien und möchte die Größe abfragen um den Nutzer vorher über die Datenmenge zu Informieren.

Die aktuelle abfrage sieht wie folgt aus:

Code:
long size = 0;
foreach (Instructions inst in instructions)
            {
                if (inst.instruction == "Download")
                {
                    WebRequest request = WebRequest.Create(inst.value1);
                    request.Method = "HEAD";
                    WebResponse response = request.GetResponse();
                    size += response.ContentLength;
                }
            }

inst.value1 behinhaltet den HTTP-Pfad zur Datei.

Bei einer Datei funktioniert es super... bei 2en auch... aber bei der dritten bricht er beim response einfach ab und das Programm reagiert nicht mehr! Habe erst gedacht, ich müsste ihm etwas zeit geben und habe nach dem Response noch ein sleep gesetzt, bringt aber auch nichts. Ich weiß nicht weiter.

Ich hoffe ihr habt einen Tipp für mich. Danke
 

rd4eva

Erfahrenes Mitglied
Das liegt ganz einfach an 2 Gründen:
1. Du schließt die Reponse nicht und hältst somit die Verbindung offen
2. Standardmässig sind in .Net nur 2 gleichzeitige Anfragen an einen Server erlaubt ( http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

Da du nun also die Verbindung offen hältst hast du logischerweise nach 2 Dateien die maximale Anzahl erreicht.

Du kannst jetzt entweder die maximale Anzahl gleichzeitiger Verbindungen erhöhen ( wovon ich abraten würde ):
C#:
ServicePointManager.DefaultConnectionLimit = 1000;

oder du arbeitest sauber (sorry) und schließt die Verbindung wenn du sie nicht mehr benötigst:
C#:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(inst.value1);
   request.Method = "HEAD";

using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   size += response.ContentLength;

Die using Direktive impliziert ein response.Close();

P.S. Wenn die Summe der Dateigrößen 2GB nicht übersteigt (wovon ich mal ausgehe) hätte es auch ein int anstatt long getan.
 
Zuletzt bearbeitet:

ruNN0r

Erfahrenes Mitglied
Ach, ich idiot.
Ja, ich habe nun ein response.Close(); rangehängt und hat geklappt... Ok, doofer Fehler. Manchmal übersieht man sowas im eigenen Quelltext.

OK, das Long habe nur genommen da mir das ContentLength ein Long liefert. Aber stimmt, mehr als 2GB brauche ich selten ^^

Aber dabei noch gleich eine Anschlussfrage ;)
Kann man irgendwie im Debugger einsehen was für Verbindungen bestehen und so? Variabeln lesen bzw. Überwachen bekomm ich wohl hin.
 

ruNN0r

Erfahrenes Mitglied
ok, sowas ginge auch ^^ Habe es bisher mit Wireshark gemacht. Dachte der Debugger bietet noch weitere Funktionen die ich noch nicht kenne.
 

sheel

I love Asm
Wenn du schon Wireshark verwendest, bleib dabei :)
Das Verlinkte ist nur ein Miniprogramm, das nicht viel mehr als das Nötigste zum Funktionieren hat.

Zum Debugger: Wenn der sowas könnte wäre ein Debugger das Superprogramm,
das jede Programmiererei überflüssig macht :p
Wenn vergleichbare Netzwerküberwachung (vergleichbar zu Wireshark) drin wäre
könnte man mit der gleichen Begründung so ziemlich alles an Schnittstellenzeug einbauen.
Schnittstellen zu jeder bekannten DB, SAP...Geldscheinprüfer, Entwicklungzeug für Gameboy&Co...
 

ruNN0r

Erfahrenes Mitglied
^^ naja ich dachte halt nur, dass es eine Methode gäbe die einfach anzeigt dass eine Solche Klasse aktiv ist und eine Verbindung haben "könnte" oder etwas in der Art ^^ Aber naja, es funktioniert ja erstmal ;)

Danke euch!