Я хотел бы иметь обратный прокси (apache httpd с mod_proxy
) перед IIS, на котором размещена веб-служба SOAP. .
Проблема, с которой я столкнулся, заключается в том, что клиенты SOAP запрашивают у веб-сервера подробности о веб-службе, загружая WSDL
с конечной точки. Этот WSDL создается веб-службой и содержит URL-адреса веб-службы, которые должен использовать клиент. Проблема в том, что когда веб-служба находится за прокси-сервером, сгенерированные URL-адреса содержат неправильный частный адрес.
веб-служба IIS расположена по адресу
Проблема, с которой я столкнулся, заключается в том, что клиенты SOAP запрашивают у веб-сервера подробную информацию о веб-службе, загружая WSDL
с конечной точки. Этот WSDL создается веб-службой и содержит URL-адреса веб-службы, которые должен использовать клиент. Проблема в том, что когда веб-служба находится за прокси-сервером, сгенерированные URL-адреса содержат неправильный частный адрес.
веб-служба IIS находится по адресу
Проблема, с которой я столкнулся, заключается в том, что клиенты SOAP запрашивают у веб-сервера подробную информацию о веб-службе, загружая WSDL
с конечной точки. Этот WSDL создается веб-службой и содержит URL-адреса веб-службы, которые должен использовать клиент. Проблема в том, что когда веб-служба находится за прокси-сервером, сгенерированные URL-адреса содержат неправильный частный адрес.
веб-служба IIS расположена по адресу
http://internal.host.com/Dirname/Service.asmx
и его можно вызвать с помощью GET
или POST
.
WSDL извлекается с GET с WSDL
в качестве строки запроса:
http://internal.host.com/Dirname/Service.asmx?WSDL
Обратный прокси представляет веб-службу как:
https://proxy.host.com/VirtualDir/Service.asmx
И моя проблема в том, что содержимое динамически сгенерированного WSDL содержит внутренние URL-адреса (что прокси подключается к).
Я бы хотел избежать взлома / перекомпиляции самой веб-службы, поэтому, когда я думал об альтернативных решениях, я задавался вопросом;
Могу ли я сделать так, чтобы httpd
на прокси-сервере каким-то образом перехватывали вызов? WSDL-документа и вместо этого обслуживали статический контент, и по-прежнему перенаправлять другие запросы (включая параметры GET) на внутренний сервер IIS? ] Соответствующая конфигурация httpd в настоящее время выглядит так:
ProxyPass "/VirtualDir/" "http://internal.host.com/Dirname/"
И я подумал, что, возможно, RewriteCond и RewriteRule можно было бы использовать каким-то умным способом, чтобы перехватывать только запросы к /.../ Service.asmx? WSDL
и вместо этого обслуживать статический локальный документ, и перенаправить «остальное» в IIS, но я действительно не знаю, как это сделать правильно, не нарушая ничего другого.
Обратный прокси-сервер также используется для других служб, в других виртуальных «каталогах».
Я пока работал над проблемой, создавая статическую спецификацию WSDL, содержащую правильные (проксированные) адреса для методов службы, и предлагая клиентам использовать этот адрес. .
Кажется, все работает нормально, но его нужно будет обновлять каждый раз, когда интерфейс WebService изменяется.
Я установил статический файл на прокси-сервере apache http по этому адресу:
https://proxy.host.com/other_static_dir/Service.wsdl
Он содержит правильная спецификация WSDL с общедоступными URI для использования. Я загрузил его из IIS с помощью wget
и просто исправил с помощью текстового редактора.