Я хотел бы иметь обратный прокси (apache httpd с mod_proxy
) перед IIS, на котором размещена веб-служба SOAP.
Проблема, с которой я столкнулся, заключается в том, что клиенты 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
и просто исправил с помощью текстового редактора.