Почему веб-сервис 1С на IIS не работает снаружи при пробросе нестандартного порта?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разберем распространенную ситуацию: после публикации веб-сервисов 1С на веб-сервере Microsoft IIS пользователи внутри локальной сети успешно подключаются к сервису по стандартному порту 80, однако внешние клиенты, обращающиеся через проброшенный порт (например, 8088), не могут выполнить вызовы методов.

Проанализируем причину такого поведения. При открытии схемы WSDL в браузере или SOAP-клиенте загружается XML-описание сервиса. В самом конце файла располагается блок service с элементом <soapbind:address location="...">. Платформа 1С формирует этот WSDL-документ динамически, считывая сетевые параметры из входящего HTTP-запроса (серверные переменные SERVER_NAME, SERVER_PORT и заголовок Host).

Когда на сетевом шлюзе или роутере настроена трансляция портов (Port NAT) с внешнего 8088 на внутренний 80, веб-сервер IIS обрабатывает запрос как стандартное HTTP-соединение. В соответствии со спецификацией URL для 80-го порта номер порта в адресе опускается. В результате клиент успешно скачивает схему сервиса по адресу с портом 8088, но дальнейшие функциональные SOAP-запросы отправляет на адрес из атрибута location (то есть на порт 80), куда из внешней сети доступа нет.

Рассмотрим, как можно решить данную проблему на уровне веб-сервера, сетевой инфраструктуры и клиентских приложений.

Способ 1. Синхронизация портов (проброс 1:1)

Самое надежное и простое решение — сделать так, чтобы веб-сервер IIS принимал входящие запросы именно на том порту, который открыт снаружи.

Разберем по шагам настройку веб-сервера IIS:

  1. Откроем Диспетчер служб IIS (Internet Information Services Manager).
  2. В дереве подключений выберем сайт, на котором опубликована информационная база 1С (по умолчанию Default Web Site).
  3. На панели Действия справа перейдем в пункт Привязки... (Bindings).
  4. Нажмем кнопку Добавить..., укажем тип http, IP-адрес Все свободные (или конкретный внутренний IP) и порт 8088.
  5. Сохраним настройки. Теперь IIS прослушивает одновременно и 80, и 8088 порт.
  6. На сетевом маршрутизаторе или межсетевом экране изменим правило Port Forwarding: настроим трансляцию внешнего порта 8088 на внутренний порт 8088 сервера IIS.

При таком подходе модуль 1С увидит в заголовках порт 8088 и автоматически сгенерирует WSDL со строкой вида http://domain_or_ip:8088/base/ws/service.1cws. Никаких дополнительных правок в конфигурации или файле default.vrd не потребуется.

Способ 2. Публикация сервиса на отдельном сайте IIS

Если на основном сайте нельзя менять или добавлять привязки, создадим для внешних веб-сервисов отдельный сайт в IIS:

  1. В Диспетчере служб IIS создадим новый сайт, например, 1C_WebServices.
  2. При создании укажем привязку к порту 8088.
  3. Выполним публикацию веб-сервисов из конфигуратора 1С (или утилитой webinst) в этот новый сайт.
  4. На маршрутизаторе пробросим внешний порт 8088 на внутренний порт 8088.

Способ 3. Переопределение адреса подключения на стороне клиента

Если инфраструктурные настройки менять нельзя, а схема WSDL уже получена, скорректируем точку подключения (Endpoint URL) непосредственно в клиентском коде.

Если клиентом выступает другая база 1С, переопределим адрес сервиса при создании прокси:


Определения = Новый WSОпределения("http://remote.server.ru:8088/base/ws/service.1cws?wsdl", "Логин", "Пароль");
// Явно указываем адрес точки подключения с нужным внешним портом:
АдресТочкиПодключения = "http://remote.server.ru:8088/base/ws/service.1cws";
Прокси = Новый WSПрокси(Определения, "http://www.sample.org/service", "ServiceName", "ServiceSoapEndpoint", , , АдресТочкиПодключения);
Прокси.Пользователь = "Логин";
Прокси.Пароль = "Пароль";
Результат = Прокси.ВыполнитьОперацию();

Если клиентом выступает стороннее приложение (.NET, Java, Python, PHP), в большинстве библиотек SOAP доступно свойство переопределения конечной точки (например, EndpointAddress или location), которое позволяет отправлять SOAP-пакеты на порт 8088, игнорируя сгенерированный внутри WSDL адрес.

Способ 4. Использование статического WSDL-файла

Рассмотрим альтернативный вариант для сторонних интеграций:

  1. Скачаем WSDL-схему через браузер в виде XML-файла.
  2. Откроем файл в текстовом редакторе и найдем тег soapbind:address.
  3. Вручную добавим порт :8088 в атрибут location.
  4. Передадим исправленный файл WSDL разработчикам внешней системы для генерации классов либо разместим его на веб-сервере как обычный статический файл.
← На главную