При попытке протестировать или отладить веб-сервис 1С с помощью утилиты SoapUI разработчики нередко сталкиваются с неприятной ситуацией: WSDL-описание без проблем открывается в браузере, штатно работает через механизм WSСсылки внутри самой 1С и даже отвечает в сторонних приложениях, однако SoapUI наотрез отказывается импортировать сервис, завершая операцию ошибкой Failed to load url. Попытка открыть тот же сервис в утилитах вроде STORM приводит к схожей ошибке: System.InvalidOperationException: Документ HTML не содержит информации обнаружения веб-служб.
Разберем детально, с чем связано такое поведение и какими способами можно восстановить нормальную работу с веб-сервисом.
Проанализируем техническую сторону взаимодействия клиента и сервера. Данная проблема характерна для платформы 1С:Предприятие ветки 8.3.9 (в частности, релиза 8.3.9.2170) и связана с зарегистрированной ошибкой платформы (код 000025093).
Рассмотрим последовательность запросов при обращении к сервису:
WWW-Authenticate, предлагая клиенту авторизоваться.WWW-Authenticate: Basic realm="1C:Enterprise 8.3". Однако в релизах платформы 8.3.9 параметр realm ошибочно опускается, и платформа отдает просто WWW-Authenticate: Basic.Рассмотрим кардинальное и наиболее правильное решение. Производитель исправил ошибку формирования заголовка WWW-Authenticate, начиная с версий платформы 8.3.10 (в частности, 8.3.10.1877 и выше).
Разберем порядок действий:
webinst, чтобы обновить модули расширения веб-сервера.Если быстро обновить платформу на рабочем сервере невозможно, решим задачу обходным путем без изменения серверной части. Мы можем изолировать этап загрузки схемы от этапа выполнения запросов.
Выполним следующие шаги:
service.wsdl или service.xml.Чтобы SoapUI не получал от 1С некорректный ответ с кодом 401, настроим его так, чтобы он сразу передавал учетные данные в первом же запросе без предварительного согласования.
Разберем настройку клиента:
http://пользователь:пароль@сервер/база/ws/сервис.1cws?wsdl.Если перед 1С установлен веб-сервер, мы можем исправить некорректный заголовок ответа средствами самого веб-сервера.
Например, в конфигурационном файле веб-сервера Apache с включенным модулем mod_headers добавим директиву для переопределения заголовка при ошибке 401:
<Location "/база">
Header always set WWW-Authenticate "Basic realm=\"1C:Enterprise 8.3\"" "expr=%{REQUEST_STATUS} == 401"
</Location>
После перезапуска веб-сервера заголовок станет полностью совместим со стандартами, и SoapUI сможет автоматически запрашивать авторизацию.
Если веб-сервис используется для закрытого внутреннего контура или тестовых стендов, разберем еще один вариант обхода проблемы: прописать параметры подключения непосредственно в файле публикации default.vrd.
В строке подключения к информационной базе (атрибут ib) укажем имя пользователя и пароль:
ib="Srvr=Server1C;Ref=BaseName;Usr=WebServiceUser;Pwd=SecretPassword;"
В таком случае веб-сервер будет обращаться к информационной базе под заранее определенной учетной записью, первичный ответ 401 выдаваться не будет, и WSDL успешно прочитается любым внешним клиентом без ошибок.