При интеграции сторонних систем или баз 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.
Проанализируем ключевые причины возникновения данной проблемы и рассмотрим способы их решения.
Рассмотрим структуру файла публикации 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.
Разберем, как исправить эту ситуацию:
http://<сервер>:<порт>/<имя_базы>/ws/<alias.1cws>?wsdl.default.vrd или переопубликуем сервис через конфигуратор 1С (меню Администрирование → Публикация на веб-сервере).Выясним причину, почему при динамической смене порта или хоста WS-ссылка продолжает отправлять запросы на старый адрес. Статический объект метаданных WSСсылка сохраняет исходную WSDL-схему на момент импорта. В этой схеме зафиксирован параметр soap:address location.
Если WSDL загружалась при разработке со стандартного порта 80 или с localhost, то при вызове методов клиент 1С будет пытаться отправлять SOAP-запросы по старому адресу, даже если новое подключение инициируется по другому порту.
Для решения проблемы выполним одно из следующих действий:
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();
Если веб-сервер опубликован на нестандартном порту (например, 23083), IIS может формировать некорректные заголовки Host или сбрасывать порт на 80-й по умолчанию, если привязка сайта настроена не полностью.
Разберем настройку привязок в диспетчере IIS:
http. Если сервис должен отвечать на порту 23083, добавим или отредактируем привязку, указав соответствующий порт и нужный IP-адрес (или «Все свободные»).При использовании веб-сервисов 1С на платформе IIS необходимо учитывать системные требования к обработчику wsisapi.dll:
True. Для пула также рекомендуется выбрать версию .NET Framework: Без управляемого кода (No Managed Code).wsisapi.dll добавлен в список и имеет статус Разрешено (Allowed).IUSR или IIS_IUSRS) имеет полные права доступа на каталог с информационной базой 1С.