Создайте прямое соединение между клиентским ПК и удаленным frp-сервером

#asp.net #http #ftp #file-transfer

#asp.net #http #ftp #передача файлов

Вопрос:

Всем доброго дня..

Я передаю Asp.Net Веб-приложение, в котором я должен реализовать загрузку файлов, но с небольшим усложнением:

Чтобы лучше объяснить, приложение запущено на сервере «A». Файлы должны быть загружены на совершенно другой сервер «B»..

Как только клиент «C» загружает файл через интерфейс сайта, файл должен быть фактически загружен на сервер B.

Технически я уже достиг этого:

  • клиент выбирает файл, который он хочет загрузить со своего компьютера, затем нажимает «загрузить»
  • во время обратной отправки страницы «сервер загружает файл, не сохраняя его
  • Я получаю поток файлов из элемента управления FileUploas и отправляю его по ftp на сервер «B»;

НО, делая это, фактически файл передается дважды (C -> A -> B), что делает процесс загрузки файла пользователем более длительным, чем обычно..

Мой вопрос: возможно ли открыть «прямое» соединение между «C» и «B» через интерфейс сайта (работающий на сервере «A»), чтобы выполнить одну передачу? Очевидно, я должен иметь возможность делать то же самое во время загрузки..

Альтернативой (по крайней мере, во время загрузки) должно быть «скрытие» двойной передачи путем сохранения временного файла на сервере «A», а затем повторной передачи его на «B», запускающей отдельную задачу, чтобы пользователь мог выполнять новые действия на сайте после «первой» загрузки.

Приветствуются любые предложения (даже совершенно разные решения, затем я оценю «совместимость» с моим проектом)

Заранее благодарю вас,

Alberto

Примечание: Я выбираю FTP, потому что клиент должен иметь возможность выбирать, где он хочет разместить сервер «B» (он может использовать «наш» ftp или, если он у него есть, отправлять файлы туда), и я думаю, что FTP является наиболее «совместимым» и «быстро настраиваемым» решением, поскольку ftp управляется аналогично независимому от платформы сервера «B».

Ответ №1:

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

  1. клиент C устанавливает командный канал с сервером A
  2. сервер A устанавливает командный канал с сервером B
  3. клиент начинает подготовку к передаче данных. В этот момент C запрашивает пассивный режим у сервера A. A немедленно начинает подготовку к передаче данных с сервера B и запрашивает пассивный режим у сервера B. Эта подготовка A-B должна полностью проходить между тем, как сервер A получает команду PASV от C и когда он отправляет ответ на эту команду. Так что это должно быть быстро (я думаю, максимум 2-3 секунды).
  4. Сервер A получает адрес и порт для подключения с сервера B и отправляет эти данные в ответ на команду PASV, полученную от C.
  5. C передает данные на B. Сервер A получает «Передача завершена» от B по командному каналу и отправляет то же самое клиенту.
  6. Теперь сервер A может закрыть командный канал для сервера B (при необходимости).

Вышесказанное требует, чтобы вы знали подробности протокола FTP и, скорее всего, реализовали его самостоятельно как клиент, так и сервер. И это может занять довольно много времени.

Комментарии:

1. Привет, Евгений, спасибо за ответ.. Прошу прощения за неясность .. дело в том, что я технически не знаю, какой тип соединения мне следует использовать для подключения C к B, но я думаю, что лучшим вариантом является использование ftp.. В моей настройке клиент представляет собой простой браузер, который должен использовать asp.net приложение, запущенное на сервере «A», в то время как «B» должно использоваться «прозрачным» образом в качестве файлового сервера.. Я рассмотрю команды PASV и командные каналы (я даже не знал об их существовании, но я постараюсь исправить !!!).. Спасибо!

2. Уточнение, чтобы не тратить мое время на «бесполезные» задачи (знания всегда полезны): возможно ли воспроизвести систему, которую вы описали в моем случае: — сервер A является моим ASP.net приложение, над которым у меня есть полный контроль — C должен быть обычным браузером — B должна быть папка на общем FTP-сервере, где теоретически у меня нет никакого контроля, кроме знания имени сервера, имени пользователя и пароля (если требуется)

3. @Alberto если C — это просто браузер, то единственное, о чем я могу подумать, это заставить B запустить веб-сервер и направить пользователя туда для загрузки (открыв новую страницу в новой вкладке / окне). Моя великолепно разработанная 😉 схема в этом случае не сработала бы.

4. @alberto Добро пожаловать в SO. Вы можете обновить свой собственный вопрос, отредактировав его. Вы можете голосовать за вопросы (голосовать «за» или «против»), и если вы получите ответ, который удовлетворяет вашим потребностям и отвечает на ваш вопрос, вы можете пометить его как ответ

5. @Eugene еще раз спасибо.. Я думаю, что, по крайней мере, на данный момент, я реализую функциональность «простым способом», с двойной передачей, и в случае чего «расширю» весь проект и осуществлю отличную схему, которую вы любезно разработали для меня! Я отмечу ответ как решение, даже если он не подходит к моей ситуации! Спасибо!