Ошибка с кодом 406 (Not Acceptable) при обращении к HTTP-сервису 1С, опубликованному на IIS, является довольно специфичной. Она сигнализирует о том, что веб-сервер не может сформировать ответ, который удовлетворял бы клиента, или же столкнулся с внутренним сбоем в управлении сессиями. В рамках данной статьи мы разберем, как диагностировать эту проблему и какие шаги предпринять для ее устранения.
Как показывает практика, зачастую проблема кроется в зависании рабочих процессов или переполнении пула соединений на стороне сервера 1С. Если сервис работал стабильно, а затем внезапно начал выдавать 406 ошибку, первое, что нам нужно сделать — это произвести сброс.
Рассмотрим последовательность действий:
Чаще всего эти действия позволяют восстановить работоспособность сервиса без глубокого вмешательства в настройки конфигурации.
Если рестарт помогает лишь временно, необходимо проанализировать параметры публикации вашего сервиса. Часто ошибка возникает из-за нехватки ресурсов пула соединений. Разберем, как правильно настроить параметры в файле default.vrd.
Откройте файл default.vrd в папке публикации вашего веб-сервиса. Убедитесь, что для вашего httpServices корректно заданы параметры. Если описание сервиса отсутствует, добавьте его вручную в блок httpServices.
Пример структуры файла default.vrd:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/my_service" ib="Srvr="Server";Ref="BaseName";">
<httpServices>
<service name="MyService" rootUrl="my_service" poolSize="20" poolTimeout="60"/>
</httpServices>
</point>
Разберем параметры, которые влияют на стабильность работы:
poolSize — количество соединений в пуле. Увеличение этого параметра поможет, если запросы к сервису идут массово и конкурентно.poolTimeout — время ожидания свободного сеанса. Если значение слишком мало, IIS вернет 406 ошибку, так как не дождется освобождения сессии.sessionMaxAge — максимальное время жизни сессии.Чтобы понять точную причину ошибки 406, нам необходимо заглянуть в логи. IIS записывает все неудачные запросы в свои лог-файлы.
Проанализируем следующие моменты:
C:\inetpub\logs\LogFiles).sc-status с кодом 406.time-taken. Если это значение превышает установленный вами poolTimeout, это прямое указание на нехватку ресурсов пула.Если в логах IIS нет явной информации, обратитесь к технологическому журналу 1С. В нем можно отследить, доходит ли запрос до самого кода 1С или обрывается на этапе передачи данных веб-сервером.
Так как вы упомянули, что HTTP-сервис реализован в расширении, важно учитывать особенности работы платформы:
Во-первых, при обновлении конфигурации или расширения метаданные могут кэшироваться. Попробуйте выполнить перепубликацию. Для этого можно воспользоваться утилитой webinst или пересоздать публикацию через конфигуратор.
Во-вторых, проверьте отсутствие конфликтов типов данных. Ошибка 406 часто возникает, когда заголовок Accept в запросе клиента не соответствует Content-Type, который возвращает метод 1С. Убедитесь, что вызывающее приложение запрашивает именно тот формат (обычно application/json или application/xml), который ваш код явно прописывает в объекте HTTPОтвет.
Пример корректной отправки ответа из кода 1С:
Ответ = Новый HTTPОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ДанныеJSON);
Подводя итог, можно сказать, что решение проблемы чаще всего лежит в плоскости обслуживания инфраструктуры: очистки пулов, увеличения poolSize и настройки таймаутов в default.vrd. Если же это не помогает, следует проверить корректность заголовков в запросах клиента и актуальность опубликованных файлов метаданных.