Как сделать передачу файлов с сервера на сервер без какого-либо взаимодействия с пользователем? - PullRequest
8 голосов
/ 16 февраля 2011

В моем сценарии пользователи могут загружать zip-файлы в a.example.com

. Я бы хотел создать «демона», который через заданные промежутки времени будет перемещать-переносить любые zip-файлы, загруженные пользователями изa.example.com до b.example.com

Из информации, которую я собрал,

  1. Демон будет универсальным обработчиком .ashx.
  2. Демон будетзапускается через указанные промежутки времени с помощью задания plesk cron
  3. Демон (благодаря SLaks ) будет состоять из двух запросов FtpWebRequest (один для чтения и один для записи).

Итак, вопрос в том, как я могу реализовать шаг 3?

  • Должен ли я считывать в массив memory () весь файл и пытаться записать егов b.example.com?
  • Как мне записать прочитанную информацию в b.example.com?
  • Могу ли я одновременно выполнять чтение и запись файла?

Нет, я не прошу полный код, я просто могу понять, как я могу выполнять чтение и записьна лету, без взаимодействия с пользователем.

Я имею в виду, что я мог бы загрузить файл локально с a.example.com и загрузить его на b.example.com, но это не главное.

Ответы [ 8 ]

8 голосов
/ 21 февраля 2011

Вот еще одно решение:

  1. Пусть ASP.Net на сервере A получает файл как обычный файл для загрузки и сохраняет его в каталоге XXX
  2. Имеет службу Windows на сервереA, который проверяет каталог XXX на наличие новых файлов.
  3. Разрешите оконной службе загрузить файл на сервер B, используя HttpWebRequest
  4. Разрешите серверу B получить файл с помощью обычной страницы загрузки файла ASP.Net.

Ссылки:

Проблемы, которые необходимо решить:

  1. Как определить, какие файлы загружать на сервер B. Я бы использовал Directory.GetFiles в Timer для поиска новых файлов вместо FileSystemWatcher.Вы должны быть в состоянии проверить, был ли файл загружен ранее (удалите его, переименуйте его, проверьте БД или все, что вам подходит).

  2. Аутентификация на сервере B, так что толькоВы можете загрузить файлы к нему.

5 голосов
/ 23 февраля 2011

Чтобы ответить на ваши вопросы - да, вы можете читать и писать файлы одновременно.

Вы можете открыть FTPWebRequest для ServerA и FTPWebRequest для ServerB. На FTPWebRequest к серверу А вы запросите файл и получите ResponseStream. Получив ResponseStream, вы будете одновременно читать кусок байтов и записывать этот кусок байтов на серверB RequestStream.

Единственной памятью, которую вы бы использовали, был бы буфер byte[] в цикле чтения / записи. Просто имейте в виду, что базовая реализация FTPWebRequest загрузит полный файл FTP перед возвратом потока ответов.

Аналогично, вы не можете отправить свой FTPWebRequest для загрузки нового файла, пока не будут записаны все байты. По сути, операции будут происходить синхронно. Вы позвоните по номеру GetResponse, который не вернется, пока не будет доступен полный файл, и только тогда вы сможете «загрузить» новый файл. * 1018 Ссылки *:

FtpWebRequest

3 голосов
/ 24 февраля 2011

Необходимо учитывать, что при обновлении AppDomain длительные веб-запросы (ваш общий обработчик .ashx) могут быть уничтожены.Поэтому вы должны реализовать в своем коде какую-то атомарную логику транзакций, и вам придется обрабатывать внезапные отключения и неполные передачи FTP, если вы идете таким образом.Эта облачная платформа поддерживает распределенную файловую систему и имеет встроенные атомарные транзакции.Кроме того, он быстро масштабируется, если ваш сервис будет быстро расти.

2 голосов
/ 24 февраля 2011

Я бы сделал это довольно просто. Клиентская программа загружает файл на сервер A. Это можно сделать очень легко в C # с помощью FtpWebRequest.

http://msdn.microsoft.com/en-us/library/ms229715.aspx

Я бы тогда имел службу на сервере А, которая контролирует каталог, куда загружаются файлы. Когда файл загружается в этот каталог или через определенные промежутки времени, он просто копирует файлы на сервер B. Опять же, это может быть сделано через Ftp или другим способом, если они находятся в одной сети.

1 голос
/ 27 февраля 2011

настройка ключей, если вы используете системы на основе Linux:

http://compdottech.blogspot.com/2007/10/unix-login-without-password-setting.html

После того, как у вас работают ключи, вы можете скопировать файл из системы A в систему B, написав обычныйсценарии оболочки, которые не требуют взаимодействия с пользователем.

1 голос
/ 23 февраля 2011

Если обе машины находятся в одном домене, не могли бы вы просто выполнить репликацию файлов на уровне ОС? ДФС

1 голос
/ 16 февраля 2011

Похоже, вам не нужен веб-сервис или обработчик.Все, что вам нужно, это программа, которая через равные промежутки времени открывает FTP-соединение с другим сервером и перемещает файлы.Это может быть сделано любой программой .NET с библиотекой System.WebClient, не обязательно должно быть «веб-приложением»Эта другая программа может быть службой, которая может обрабатывать свое собственное время, или простым приложением, запущенным вашим заданием cron.Если вам это нужно, чтобы пойти двумя путями, например, если два сервера являются зеркалами, у вас просто будет одно и то же приложение во втором блоке, делающее одно и то же для загрузки файлов в первый.

1 голос
/ 16 февраля 2011

вам нужен слушатель в целевом домене, на котором работает ftp-сервер, а на стороне клиента вы будете использовать System.Net.WebClient и UploadFile или UploadFileAsync для отправки файла. это то, что вы спрашиваете?

...