Super Danke!
Ich denke der Input hilft mir kräftig weiter! werds mal probieren die Verbindung nicht immer neu zu öffnen 😉
Und dann mal diese Library verwenden wenns nicht reicht!
kann es sein, das du dich für jede einzelne datei anmeldest-überträgst-abmeldest ?
Joup das könnte sehr gut möglich sein 😉
Aber wenn ich mittels mehrer Threads auf diese Funktion zugreife müsste ich klarerweise dann für jeden Thread eine Verbindung öffnen… korrekt ?
Es liegt ziemlich sicher an der .NET-Implementierung selbst. Das betrifft nicht nur FTP, sondern auch andere Teile des Frameworks, die nicht gerade performanceoptimiert wurden. Gutes Beispiel sind die Klassen im Kompressions-Namespace. Die hinken ihren (managed) Konkurrenten teilweise um Faktoren hinterher.
Denke dass das Thema ftp schon eine Kernkomponente eines Frameworks ist. Schade das sich .Net nicht einmal auf die Steigerung der Performance stürzt!
Schonmal 1000 Dank an euch bedei!
Hallo!
Habe eine generelle Frage zum Upload von Daten mittels ftp
Lade derzeit mehrer tausend Bilder per klassischem ftpupload auf einen Server.
Da mir die ganze Sache zu langsam ging habe ich den Upload auf mehrere Thread aufgeteilt.
Nur ist das Ergebnis noch immer nicht befriedigend.
Meine Frage dazu ist mit welcher Methode kann ich einen vergleichbare Performance beim Upload von Daten wie es normale FTP Programme haben erreichen.
Wenn ich meine Sache mit z.B.: Filezilla vergleiche kommen mir die Tränen. Aber ich weis nicht woran es liegt!
Wäre für jeden Hinweis sehr dankbar.
Hier noch mein Code der von jedem Thread zum Upload der Datei benützt wird.
reqFTP = (FtpWebRequest)FtpWebRequest.Create(ftp_path);
reqFTP.Credentials = new NetworkCredential(ftp_un,ftp_pw);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0){
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close()
Ja klarer weise kann ich alles um einiges schneller machen wenn ich alle Daten komprimiere uploade und am Server wieder dekomprimiere. Aber es muss doch so auch funktionieren.
Hello
Komme zufällig aus der Geoinformatik Ecke!
Im Prinzip ist dafür keine Bibliothek notwendig! Eine Umkreis Suche kann jede Spatial Datenbank von Haus aus. Das bedeutet die Umkreisssuche wird mittels SQL angestoßen und erfolgt dann auf der Datenbank selbst.
Problem bei der ganzen Sache sind die Daten selbst. Hochqualitative freizugängliche Daten gibt es nicht. Am besten sind dafür noch die Daten von OpenGeoDB geeignet.
Diese stopfst du anschließend in eine MS Sql Server (mit spatial Erweiterung), einer Oracle spatial DB oder auch in eine PostgresDB rein. Danach brauchst nur noch das nötige SQL Statement absetzen.
Vielleicht ein dezenter Overhead für ne kleine plz Abfrage aber das wäre mein Zugang.
Einfach wäre auch der Zugriff auf ein ShapeFile. Dafür wird aber eine Bibliothek benötigt.
Hoffe ich konnte etwas helfen.
Danke! Aber ganz versteh ichs jetzt nicht.
Empfiehlt es sich nun einen bestehende Lib zu nehmen oder es einfach mit den von .Net zur Verfügung gestellten Mitteln zu machen?
Hey danke! Das ging ja schnell!!!
Zwar wollte ich das Ding so schlank und unabhängig wie möglich erstellen, da ich eine Portierung auf Mono nicht ausschließen kann aber anscheinend bleibt mir vorerst nichts anderes übrig.
Aber weiters ne vielleicht ganz dummer Frage dazu. Welche Befehle kann ich auf diese Bibliothek anwenden um der Lösung meines Problems näher zu kommen. Weis nicht wo ich da nachschauen könnte.
Vielleicht liegt es auch an der heutigen Hitze hier. Echt erledigt!
Beste Grüße aus Wien
Hallo C# Gemeinde
Stehe total bei diesem Thema an!
Ich möchte einer Methode ein Quell- und ein Ziel- Verzeichnis angeben welches danach synchronisiert wird. Das bedeutet das neue Ordner/Dateien vom Quellverzeichnis auf das Zeilverzeichnis kopiert werden und umgekehrt im Quellverzeichnis nicht mehr existierenden Ordner/Dateien auf dem Zielverzeichnis gelöscht werden. Schwierigkeit meiner Seits besteht darin dass das Zielverzeichnis auf einem ftp Server sitz und ich bis dato noch nichts mit ftp in c# zu tun hatte.
Im ersten schritt dachte ich mir ob es vielleicht schon eine fertige Methode gibt. Ist ja nicht so die Besonderheit und ich denke dass diese oft benötigt wird. Aber leider Fehlanzeige! (Oder meine Recherche war so miserabel.)
Meine Frage an euch ist nun. Wenn es nichts Adäquates derzeit gibt -> Wie ich diese Ding angehe? Nur mit Hilfe der Mithilfe der Klasse FtpWebRequest oder gibt’s da noch weitere Herlferlein.
Bin für jeden kleinsten Tipp sehr dankbar!
Wirklich ein großes Dankeschön,hat mir wirklich vollkommen weitergeholfen.
Also die Variablennamen und die Variablen des Poststrings encodiere ich nach diesem Schema und es funktioniert einwandfrei.
System.Web.HttpUtility.UrlEncode(postvariable,Encoding.GetEncoding("ISO-8859-15"));
Zwar is mir net ganz klar warum ich diese dll extra einfügen muss aber was solls, es geht auf alle Fälle.
Übrigens kann ich die Variante mit XML wirklich nur empfehlen. Da kann man schnell und "einfach" neue Seiten einarbeiten.
Also nochmals vielen Dank für die Unterstützung !!!
HaHa, Habe soeben ein neuen Hinweis gefunden warums nicht funktioniert.
Die mit HTTP Monitor aufgezeichneten Daten unterscheiden sich wenn ich die Seite mit einem Browser und danach mit meinem Programm aufrufe. Im detail sind es die POST daten die unterschiedlich sind.
Mit Browser:
__VIEWSTATE=%2FwEPDwUKLTE5NDg5NTQ3Mg9kFgICA........
mit Programm:
__VIEWSTATE=**/**wEPDwUKLTE5NDg5NTQ3Mg9kFgICAw9.........
Also passt mein Encoding wirklich nicht ich verschicke ein / wobei es der Browser als %2F versendet.
Hoffe dass das der Fehler ist. Aber wie bessere ich diesen aus.
Ich hasse Ecoding!!! Hab ich das schon mal erwähnt?
Also wirklich danke für deine Antwort.
Das mit dem IE Control is wirklich hoch interessant. Werd das auf alle Fälle mal ausprobieren.
Bezüglich der Urheberrechte kann ich nur versichern dass ich mich im legalen Bereich bewege.
Aber das Encoding is wirklich ein Hund.
Wie würde denn der Code dann aussehen? Base64 steht mir nicht zuverfügung beim aufruf
byte[] buffer = Encoding.ASCII.GetBytes(poststring);
Hatte mir vorgestellt dass statt ASCII eben BASE64 stehen muss, aber das is nicht vorhanden.
Die funktion
Convert.ToBase64String()
steht zu Verfügung. Aber ich check nicht wie ich das einbauen soll. Und vor allem wo.
Mit Thema Encoding hatte ich schon immer Schwierigkeiten.
lG Hansi
Also...
Das Hauptproblem hab ich gelöst. Aber leider hat sich nun ein neues gebildet. Bitte aufmerksam machen falls ich dies in einen neuen thread posten soll.
Ich speichere die individuellen Vorgänge um Webseiten zu holen in XML ab. Das funktioniert recht gut und ist einfach zu administrieren.
Nun ist aber auf einer aspx seite ein Problem aufgetaucht.
In hiddenfields sind __VIEWSTATE und __EVENTVALIDATION gespeichert. Da sie dynamisch sind parse ich sie raus und setze sie danach in eine POST Anfrage wieder rein.
Aber dies Anfrage bringt danach nicht das gewünschte Ergebnis. Es könnte sein dass es sich dabei um ein Encoding Problem handelt aber da hab ich schon alles Mögliche ausprobiert.
Auch bin ich mir nicht sicher wie ich Leerzeichen über POST übertrage da sich in einigen Formularfelder auch solche befinden.
Mein http aufruf schau folgendermaßen aus. Vielleicht lässt sich dabei der Fehler ableiten.
In variable1 und variable2 sind die geparsten strings drinnen.
string poststring = __VIEWSTATE=variable1&automarke=audi&__EVENTVALIDATION=variable2
byte[] unicodeBytes = Encoding.Unicode.GetBytes(poststring);
byte[] buffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes);
HttpWebRequest m_WebReq = (HttpWebRequest)WebRequest.Create(url);
m_WebReq.Method = "POST";
m_WebReq.ContentType ="application/x-www-form-urlencoded";
m_WebReq.ContentLength = buffer.Length;
Stream PostData = m_WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
m_WebReq.Timeout = 10000;
HttpWebResponse m_WebResp = (HttpWebResponse)m_WebReq.GetResponse();
Stream m_responsestream = m_WebResp.GetResponseStream();
StreamReader m_streamreader = new StreamReader(m_responsestream);
string web_content = m_streamreader.ReadToEnd();
m_streamreader.Close();
Für jede noch so kleine Hilfe wäre ich unendlich dankbar!!!
Danke schon mal für die Antwort.
Also wirklich eine hoch interessante Idee. Zwar kannte ich das vorher nicht (Newbie) aber ich hab mich jetzt mal kurz eingelesen und muss sagen ein wirklich mächtiger Ansatz. Wobei ich auch gestehen muss für meine Anwendung jetzt wäre dieses Ding schon ziemlich verschärft. Aber ich werde mal überlegen wie ich das anwenden könnte.
Wie machen das eigentlich Andere die Informationen aus dem quasi deep-Web beziehen wollen. Die einfachste Idee meiner Seits wäre irgendwie dass ich einen Webbrowser in meine Applikation einbinden würde. Danach surfe ich die gewünschte Seite an und das Programm nimmt „einfach“ den gegangenen Weg, also die übertragenen Daten auf. Danach kann ich den Selben weg dann automatisiert zurücklegen. Okay klingt witzig aber wäre einfach.
Es kann doch nicht so schwierig sein eine Seite die man manuell ganz normal in einem Browser aufruft mittels eines Programms aufzurufen. Aber ich fürchte auch dass es das ist.
Ich wäre für alle weiteren Ideen wirklich dankbar
Bin neu hier, daher Hallo erstmals.
Bevor ich das Problem schildere möchte ich generell den Zweck erklären.
Ich möchte einen kleinen Index von Gebrauchtwagen erstellen. Dazu hab ich mir gedacht ich beziehe jeden Tag von Webseiten die Autos aufgelistet haben den Webinhalt, filtere den und trage neue Autos in meine Datenbank ein. So sollten mal in einem ersten Schritt Daten von ungefähr 50 Weibseiten bezogen werden.
Nun zu meine leichten bis mittelschweren Problem.
Um zu den Seiten zu kommen auf denen die Inserate stehn sind immer gewisse Schritte notwendig. Einmal ist es möglich direkt die Seite aufzurufen. Manchmal müssen mittels POST oder GET zusätzlich Daten übertragen werden. Eine andere Variante ist dass eine Ids heraus gefiltet gehören die dann wieder z.B. post übertragen werden. Das Problem ist aber dass ich diese, bei jeder Seite unterschiedlichen Vorgehen nicht hardcoded in das Programm einbetten will. Da man leicht und einfach weiter Quellen eingeben sollte.
Eine Möglichkeit die mir eingefallen ist, die einzelnen Schritte in XML abzuspeichern und danach im Programm auszulesen und in Code umzusetzen.
Die feinste Variante wäre jedoch wenn ich dynamisch Code einbetten könnte. Also quasi unkompilierten Code der wie in eine Scriptsprache integriert wird.
Ist das Problem klar oder hab ich mich nicht ordentlich ausgedrückt. Was haltet ihr von der XML Lösung. Habt ihr andere Lösungsansätze?
Danke Danke Danke schon mal im Voraus
lG Jöhann