#c# #asp.net #iis #reverse-proxy
Вопрос:
Это немного странно…. У нас есть внутреннее веб-приложение, которое работает на сервере (А), и хранилище документов, которое работает на сервере (Б).
У меня есть простая ссылка на странице, и я хочу, чтобы пользователь мог загрузить документ(с сервера IIS (A)). Однако этот документ не существует на сервере (А) до тех пор, пока пользователь не нажмет кнопку(поскольку для отображения требуется более 40 документов, не удается загрузить их все при загрузке страницы).
Когда пользователь нажимает на ссылку(в этот момент я хотел бы, чтобы мне было предложено загрузить) Документ копируется на сервер (А), а затем перенаправляется на страницу, на которой браузер запрашивает их загрузку. Я считаю, что правильно настроил заголовок содержимого, и он работает в FireFox.
IE(7) просто открывает окно, а затем окно исчезает, если я выключу настройки безопасности, оно работает нормально, но это не вариант.
Любые идеи, как это решить. Я не могу указать непосредственно на документ на сервере(B)
ДОПОЛНЕНИЕ: Да, сервер B также является веб-сервером
Ответ №1:
Если мир может видеть сервер А, а сервер А может видеть сервер Б. Я бы рекомендовал настроить обратный прокси-сервер.
http://www.codeplex.com/urlrewriter
В основном это позволяет миру загружать файлы с сервера B, но только через обратный прокси-сервер. Вы можете создать обратный прокси-интерфейс с этой библиотекой, описанной выше, с помощью следующего правила.
Перезапись ^/скачать/(.*) http://server-b/download/1 доллар США [NC,P]
Так что в случае с
http://server-a/download/xyz.pdf
он действительно запросил бы это у
http://server-b/download/xyz.pdf
но он будет доставлен так, как если бы он исходил от сервера-a, технически это происходит с помощью обратного прокси-сервера, создающего веб-соединение с сервера-a на сервер-b и копирующего HTTP-ответ на ответ сервера-a.
Дайте мне знать, если вам понадобится какая-либо помощь.
Комментарии:
1. Я писал то же самое решение, когда появилось ваше :-). Я просто хочу отметить одно предостережение: для этого серверу B нужен веб-сервер.
2. Очень верно, я думаю, что сделал это предположение, однако обычно это довольно легко сделать. Если это не сервер, следует просто использовать сетевой диск для доставки файлов из A.
Ответ №2:
Можете ли вы использовать ajax? Например, пользователь нажимает кнопку, отправляя запрос на получение файла из B в A, и на странице появляется счетчик. Затем, когда копирование завершено, вы отключаете счетчик и даете пользователю ссылку для загрузки.
Меня проголосовали против, и у меня нет прав на комментарии, поэтому я решил уточнить здесь (возможно, это просто ужасное решение, и я его не вижу).:
- Пользователь запрашивает файл, нажав на ссылку
- Запрос отправляется на сервер A, и он отключает ссылку через ajax
- Сервер A копирует файл во временный каталог с сервера B
- Сервер А отправляет обратно ссылку на файл во временной папке
Это сработало бы, если бы сервер документов не был веб-сервером (SMB, AFS, NFS и т. Д.).
Комментарии:
1. «Есть какие-нибудь идеи, как это решить. Я не могу указать непосредственно на документ на сервере(B)», это невозможно сделать из-за этого последнего предложения.
2. Это действительно плохо, потому что оно зависит от действий, которые не являются необходимыми, таких как отключение ссылки. Вы могли бы так же легко просто нажать на ссылку, загрузить файл, а затем ответить файлом, без всего AJAX. В любом случае браузер будет заблокирован во время ожидания ответа.