Почему SoapUI выдает ошибку Failed to load url при подключении к веб-сервису 1С и как это исправить?

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

При попытке протестировать или отладить веб-сервис 1С с помощью утилиты SoapUI разработчики нередко сталкиваются с неприятной ситуацией: WSDL-описание без проблем открывается в браузере, штатно работает через механизм WSСсылки внутри самой 1С и даже отвечает в сторонних приложениях, однако SoapUI наотрез отказывается импортировать сервис, завершая операцию ошибкой Failed to load url. Попытка открыть тот же сервис в утилитах вроде STORM приводит к схожей ошибке: System.InvalidOperationException: Документ HTML не содержит информации обнаружения веб-служб.

Разберем детально, с чем связано такое поведение и какими способами можно восстановить нормальную работу с веб-сервисом.

В чем заключается причина сбоя

Проанализируем техническую сторону взаимодействия клиента и сервера. Данная проблема характерна для платформы 1С:Предприятие ветки 8.3.9 (в частности, релиза 8.3.9.2170) и связана с зарегистрированной ошибкой платформы (код 000025093).

Рассмотрим последовательность запросов при обращении к сервису:

  1. SoapUI отправляет первоначальный анонимный GET-запрос к веб-серверу для получения WSDL.
  2. Если веб-сервис или публикация требуют авторизации, сервер 1С возвращает ответ с кодом 401 Unauthorized и заголовком WWW-Authenticate, предлагая клиенту авторизоваться.
  3. Согласно стандартам HTTP, заголовок базовой аутентификации должен содержать параметр области действия, например: WWW-Authenticate: Basic realm="1C:Enterprise 8.3". Однако в релизах платформы 8.3.9 параметр realm ошибочно опускается, и платформа отдает просто WWW-Authenticate: Basic.
  4. Веб-браузеры и механизмы платформы 1С игнорируют это нарушение спецификации и выводят окно ввода логина и пароля либо повторно отправляют запрос с авторизационными данными.
  5. Строгие HTTP-клиенты, построенные на Java (включая SoapUI) или .NET, считают такой заголовок некорректным и не инициируют процесс ввода учетных данных. Вместо схемы WSDL клиент пытается распарсить тело ответа с кодом 401 (которое представляет собой обычную страницу HTML с текстом об ошибке авторизации). SoapUI не может разобрать HTML как XML-схему и генерирует сообщение Failed to load url, а STORM сообщает об отсутствии метаданных веб-службы в HTML-документе.

Способ 1. Обновление платформы 1С:Предприятие

Рассмотрим кардинальное и наиболее правильное решение. Производитель исправил ошибку формирования заголовка WWW-Authenticate, начиная с версий платформы 8.3.10 (в частности, 8.3.10.1877 и выше).

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

  1. Обновим платформу сервера 1С:Предприятие до актуального стабильного релиза (ветки 8.3.10 или старше).
  2. Выполним повторную публикацию веб-сервисов через конфигуратор или утилиту webinst, чтобы обновить модули расширения веб-сервера.
  3. Перезапустим веб-сервер (Apache или IIS) и повторим импорт WSDL в SoapUI.

Способ 2. Импорт WSDL из локального файла

Если быстро обновить платформу на рабочем сервере невозможно, решим задачу обходным путем без изменения серверной части. Мы можем изолировать этап загрузки схемы от этапа выполнения запросов.

Выполним следующие шаги:

  1. Откроем ссылку на WSDL в обычном веб-браузере, введя логин и пароль пользователя базы 1С.
  2. Сохраним полученный XML-документ на локальный диск компьютера под именем service.wsdl или service.xml.
  3. В SoapUI создадим новый SOAP-проект (меню File -> New SOAP Project).
  4. В строке Initial WSDL выберем сохраненный локальный файл вместо сетевого URL. SoapUI корректно построит структуру запросов на основе локальной схемы.
  5. Откроем созданный запрос в дереве проекта и в строке адреса (Service Endpoint) укажем реальный боевой URL веб-сервиса.
  6. В панели параметров запроса (Request Properties) введем значения полей Username и Password для авторизации в 1С.

Способ 3. Включение упреждающей аутентификации (Preemptive Authentication)

Чтобы SoapUI не получал от 1С некорректный ответ с кодом 401, настроим его так, чтобы он сразу передавал учетные данные в первом же запросе без предварительного согласования.

Разберем настройку клиента:

  1. В главном меню SoapUI откроем раздел File -> Preferences.
  2. Перейдем на вкладку HTTP Settings.
  3. Установим флаг напротив пункта Authenticate preemptively и нажмем OK.
  4. При создании проекта или отправке запросов также можно передавать учетные данные прямо в адресной строке: http://пользователь:пароль@сервер/база/ws/сервис.1cws?wsdl.

Способ 4. Доработка заголовка на стороне веб-сервера

Если перед 1С установлен веб-сервер, мы можем исправить некорректный заголовок ответа средствами самого веб-сервера.

Например, в конфигурационном файле веб-сервера Apache с включенным модулем mod_headers добавим директиву для переопределения заголовка при ошибке 401:


<Location "/база">
    Header always set WWW-Authenticate "Basic realm=\"1C:Enterprise 8.3\"" "expr=%{REQUEST_STATUS} == 401"
</Location>

После перезапуска веб-сервера заголовок станет полностью совместим со стандартами, и SoapUI сможет автоматически запрашивать авторизацию.

Способ 5. Прописывание пользователя в файле публикации default.vrd

Если веб-сервис используется для закрытого внутреннего контура или тестовых стендов, разберем еще один вариант обхода проблемы: прописать параметры подключения непосредственно в файле публикации default.vrd.

В строке подключения к информационной базе (атрибут ib) укажем имя пользователя и пароль:

ib="Srvr=Server1C;Ref=BaseName;Usr=WebServiceUser;Pwd=SecretPassword;"

В таком случае веб-сервер будет обращаться к информационной базе под заранее определенной учетной записью, первичный ответ 401 выдаваться не будет, и WSDL успешно прочитается любым внешним клиентом без ошибок.

← На главную