In meinem Szenario können Benutzer zip-Dateien in a.example.com
Ich würde gerne einen "Daemon" erstellen, der in bestimmten Zeitintervallen verschoben wird - transferiert alle von den Benutzern hochgeladenen Zip-Dateien von a.example.com
nach b.example.com
Aus den Informationen, die ich bisher gesammelt habe,
Die Frage ist also, wie könnte ich Schritt 3 umsetzen?
b.example.com
? b.example.com
gelesen habe? Nein, ich frage nicht nach dem vollständigen Code, ich kann nur herausfinden, wie ich das Lesen und Schreiben im laufenden Betrieb ohne Benutzerinteraktion durchführen könnte.
Ich meine, ich könnte die Datei lokal von a.example.com
herunterladen und sie bei b.example.com
hochladen, aber das ist nicht der Punkt.
Um Ihre Fragen zu beantworten - Ja, Sie können die Dateien gleichzeitig lesen und schreiben.
Sie können FTPWebRequest
zu ServerA und% FTPWebRequest
zu ServerB öffnen. Auf dem FTPWebRequest
zu ServerA würden Sie die Datei anfordern und die ResponseStream
erhalten. Sobald Sie die ResponseStream
haben, würden Sie einen Block von Bytes gleichzeitig lesen und diesen Chunk von Bytes in den ServerB RequestStream
schreiben.
Der einzige Speicher, den Sie verwenden würden, wäre der byte[]
-Puffer in Ihrer Lese- / Schreibschleife. Beachten Sie jedoch, dass die zugrunde liegende Implementierung von FTPWebRequest
die vollständige FTP-Datei herunterladen wird, bevor der Antwortstream zurückgegeben wird.
Ebenso können Sie Ihre FTPWebRequest
nicht senden, um die neue Datei hochzuladen, bis alle Bytes geschrieben wurden. In der Tat werden die Operationen synchron ausgeführt. Sie rufen GetResponse
auf, das nicht zurückkehrt, bis die vollständige Datei verfügbar ist, und nur dann können Sie die neue Datei "hochladen".
Referenzen:
Hier ist eine andere Lösung:
HttpWebRequest
auf Server B hochladen
Links:
Probleme, die du lösen musst:
So ermitteln Sie, welche Dateien auf den Server B hochgeladen werden. Ich würde Directory.GetFiles
in einem Timer
verwenden, um neue Dateien zu finden, anstatt eine FileSystemWatcher
zu verwenden. Sie müssen überprüfen können, ob eine Datei zuvor hochgeladen wurde (löschen Sie sie, benennen Sie sie um, überprüfen Sie die Datenbank oder was auch immer Ihren Anforderungen entspricht).
Authentifizierung auf Server B, sodass nur Sie Dateien hochladen können.
Etwas, das Sie berücksichtigen müssen, ist, dass lange laufende Webanfragen (Ihr .ashx-generischer Handler) beim Aktualisieren der AppDomain gelöscht werden können. Daher müssen Sie in Ihrem Code eine Art atomarer Transaktionslogik implementieren, und Sie sollten mit plötzlichen Verbindungsunterbrechungen und unvollständigen FTP-Übertragungen umgehen, wenn Sie diesen Weg gehen.
Haben Sie sich Windows Azure schon mal angesehen? Diese Cloud-Plattform unterstützt verteilte Dateisysteme und verfügt über integrierte atomare Transaktionen. Plus es skaliert schön, sollte Ihr Service schnell wachsen.
Ich würde es ziemlich einfach machen. Das Client-Programm lädt die Datei auf Server A. Dies kann sehr einfach in C # mit einem FtpWebRequest durchgeführt werden.
Ich hätte dann einen Dienst auf Server A, der das Verzeichnis überwacht, in das die Dateien hochgeladen werden. Wenn eine Datei in dieses Verzeichnis oder in bestimmten Intervallen hochgeladen wird, kopiert sie einfach Dateien auf Server B. Wiederum kann dies über Ftp oder andere Mittel geschehen, wenn sie sich im selben Netzwerk befinden.
Es klingt so, als ob Sie keinen Webservice oder Handler brauchen. Sie benötigen lediglich ein Programm, das in regelmäßigen Abständen eine FTP-Verbindung zum anderen Server herstellt und die Dateien verschiebt. Dies kann von jedem .NET-Programm mit der System.WebClient-Bibliothek durchgeführt werden, es muss keine "Web-App" sein. Dieses andere Programm könnte ein Dienst sein, der mit seinem eigenen Timing umgehen kann, oder eine einfache App, die von Ihrem Cron-Job ausgeführt wird. Wenn Sie dies auf zwei Arten tun müssen, zum Beispiel wenn die beiden Server Spiegel sind, haben Sie einfach die gleiche App in der zweiten Box, die das gleiche macht, um Dateien auf die erste hochzuladen.
Richten Sie Schlüssel ein, wenn Sie Linux-basierte Systeme verwenden:
Sobald die Schlüssel funktionieren, können Sie die Datei von System A nach System B kopieren, indem Sie normale Shell-Skripts schreiben, die keine Benutzerinteraktionen erfordern.
Tags und Links c# asp.net vb.net ftp ftpwebrequest