Почему при вызове метода Web-сервиса 1С на IIS возникает ошибка HTTP 404 Not Found?

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

При интеграции сторонних систем или баз 1С через Web-сервисы (SOAP) разработчики нередко сталкиваются с ситуацией: подключение к сервису и авторизация проходят успешно, однако при попытке вызвать любую операцию сервис возвращает ошибку с кодом HTTP 404 (Not Found). Разберем по шагам, почему возникает эта ошибка при публикации базы на веб-сервере IIS и как правильно настроить веб-сервис для стабильной работы.

Типичный текст ошибки в платформе выглядит следующим образом:


Ошибка соединения!
{ОбщийМодуль.МодульОбмена.Модуль(11)}: Ошибка при вызове метода контекста (GetParents): Ошибка вызова операции сервиса: {arm_selle}:arm_prodavec:GetParents(): Ошибка HTTP: HTTP Status (404).
The requested URL /ut_obuv/ws/arm_prodavec was not found on this server.

Проанализируем ключевые причины возникновения данной проблемы и рассмотрим способы их решения.

Причина 1. Несоответствие URL-адреса и псевдонима (alias) в файле default.vrd

Рассмотрим структуру файла публикации default.vrd. В секции описания точек подключения веб-сервисов указываются имя объекта в дереве метаданных и его псевдоним (alias):


<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
        base="/ut_obuv"
        ib="File="C:\1C\УТ";"
        enable="false">
    <ws>
        <point name="arm_prodavec"
               alias="arm_selle.1cws"
               enable="true"/>
    </ws>
</point>

Обратим внимание: при обращении к сервису по протоколу SOAP веб-сервер ожидает запрос по адресу, содержащему именно псевдоним с расширением .1cws (например, /ut_obuv/ws/arm_selle.1cws). Если клиент отправляет запрос по внутреннему имени объекта метаданных без расширения (/ut_obuv/ws/arm_prodavec), веб-сервер не находит соответствующий обработчик и возвращает статус 404.

Разберем, как исправить эту ситуацию:

  1. Проверим правильность формирования адреса при обращении к сервису. Он должен соответствовать шаблону: http://<сервер>:<порт>/<имя_базы>/ws/<alias.1cws>?wsdl.
  2. Если псевдоним не совпадает с ожиданиями клиента, скорректируем файл default.vrd или переопубликуем сервис через конфигуратор 1С (меню Администрирование → Публикация на веб-сервере).

Причина 2. Кэширование адреса конечной точки в объекте «WS-ссылка»

Выясним причину, почему при динамической смене порта или хоста WS-ссылка продолжает отправлять запросы на старый адрес. Статический объект метаданных WSСсылка сохраняет исходную WSDL-схему на момент импорта. В этой схеме зафиксирован параметр soap:address location.

Если WSDL загружалась при разработке со стандартного порта 80 или с localhost, то при вызове методов клиент 1С будет пытаться отправлять SOAP-запросы по старому адресу, даже если новое подключение инициируется по другому порту.

Для решения проблемы выполним одно из следующих действий:

  1. В конфигураторе откроем объект WS-ссылка и выполним команду повторной загрузки WSDL с актуального рабочего адреса.
  2. Перейдем на программное создание прокси без жесткой привязки к статическому объекту метаданных. Посмотрим на пример программной инициализации соединения с помощью объектов WSОпределения и WSПрокси:

URLОписания = "http://server-app:23083/ut_obuv/ws/arm_selle.1cws?wsdl";
Определения = Новый WSОпределения(URLОписания, "ИмяПользователя", "ПарольПользователя");

URIПространстваИмен = "arm_selle";
ИмяСервиса = "arm_prodavec";
ИмяПорта = "arm_prodavecSoap";

Прокси = Новый WSПрокси(Определения, URIПространстваИмен, ИмяСервиса, ИмяПорта);
Прокси.Пользователь = "ИмяПользователя";
Прокси.Пароль = "ПарольПользователя";

// Вызов метода веб-сервиса
Результат = Прокси.GetParents();

Причина 3. Некорректные привязки (Bindings) и нестандартные порты в IIS

Если веб-сервер опубликован на нестандартном порту (например, 23083), IIS может формировать некорректные заголовки Host или сбрасывать порт на 80-й по умолчанию, если привязка сайта настроена не полностью.

Разберем настройку привязок в диспетчере IIS:

  1. Откроем Диспетчер служб IIS (Internet Information Services).
  2. В дереве подключений выберем нужный сайт (или Default Web Site).
  3. На панели Действия справа нажмем Привязки... (Bindings).
  4. В окне привязок проверим, указан ли явный порт для протокола http. Если сервис должен отвечать на порту 23083, добавим или отредактируем привязку, указав соответствующий порт и нужный IP-адрес (или «Все свободные»).

Причина 4. Настройки пула приложений и ограничений ISAPI в IIS

При использовании веб-сервисов 1С на платформе IIS необходимо учитывать системные требования к обработчику wsisapi.dll:

  1. Разрядность пула приложений: если установлена 32-разрядная версия платформы 1С, в дополнительных параметрах используемого пула приложений IIS параметр Разрешены 32-разрядные приложения (Enable 32-Bit Applications) должен иметь значение True. Для пула также рекомендуется выбрать версию .NET Framework: Без управляемого кода (No Managed Code).
  2. Ограничения ISAPI и CGI: на уровне сервера в IIS откроем раздел Ограничения ISAPI и CGI (ISAPI and CGI Restrictions) и убедимся, что путь к используемой библиотеке wsisapi.dll добавлен в список и имеет статус Разрешено (Allowed).
  3. Права доступа к файловой базе: если база данных файловая, удостоверимся, что системная учетная запись пула (например, IUSR или IIS_IUSRS) имеет полные права доступа на каталог с информационной базой 1С.
← На главную