Wie wird eine Server-Server-Dateiübertragung ohne Benutzerinteraktion durchgeführt?

8

In meinem Szenario können Benutzer zip-Dateien in a.example.com

hochladen

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,

  1. Der Daemon wird ein generischer .ash -Handler sein.
  2. Der Daemon wird in den angegebenen Zeitintervallen über einen Plesk-Cron-Job ausgelöst
  3. Der Daemon (dank SLaks ) besteht aus zwei FtpWebRequests (Einer zum Lesen und einer zum Schreiben).

Die Frage ist also, wie könnte ich Schritt 3 umsetzen?

  • Muss ich die gesamte Datei in ein memory () -Array einlesen und versuchen, das in b.example.com ?
  • zu schreiben
  • Wie könnte ich die Informationen schreiben, die ich in b.example.com gelesen habe?
  • Kann ich die Datei gleichzeitig lesen und schreiben?

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.

    
OrElse 16.02.2011, 18:27
quelle

8 Antworten

5

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:

FTPWebRequest

    
Tony 23.02.2011, 18:27
quelle
8

Hier ist eine andere Lösung:

  1. Lassen Sie ASP.Net in Server A die Datei als reguläre Datei hochladen und speichern Sie sie im Verzeichnis XXX
  2. Verfügen Sie über einen Windows-Dienst auf Server A, der das Verzeichnis XXX nach neuen Dateien durchsucht.
  3. Lassen Sie den Fensterservice die Datei mit HttpWebRequest auf Server B hochladen
  4. Lassen Sie den Server B die Datei auf einer normalen ASP.Net-Datei-Upload-Seite empfangen.

Links:

Probleme, die du lösen musst:

  1. 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).

  2. Authentifizierung auf Server B, sodass nur Sie Dateien hochladen können.

jgauffin 20.02.2011 21:10
quelle
3

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.

    
Bart Verkoeijen 24.02.2011 09:35
quelle
2

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.

    
Justin 24.02.2011 20:01
quelle
1

Sie benötigen einen Listener in der Zieldomäne, einen FTP-Server, der dort läuft, und auf der Clientseite verwenden Sie System.Net.WebClient und UploadFile oder UploadFileAsync, um die Datei zu senden. ist das was du fragst?

    
Alex 16.02.2011 18:31
quelle
1

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.

    
KeithS 16.02.2011 19:25
quelle
1

Wenn sich beide Maschinen in derselben Domäne befinden, könnten Sie nicht einfach die Dateireplikation auf Betriebssystemebene durchführen? DFS

    
Webjedi 23.02.2011 18:33
quelle
1

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.

    
Sandeep Singhal 27.02.2011 20:27
quelle

Tags und Links