Ситуация, когда HTTP-сервис 1С стабильно работает на локальной машине, но периодически возвращает ошибку 500 (Internal Server Error) при обращении с другого сервера, является классической проблемой настройки связки IIS + 1С. Особенно часто это проявляется при использовании Windows-аутентификации и протокола HTTPS. Рассмотрим детально, почему запрос может «отваливаться» на стороне веб-сервера, даже не доходя до Журнала регистрации 1С, и как это исправить.
Прежде чем приступать к глубоким настройкам сервера, нам необходимо убедиться, что проблема локализована именно в IIS или модуле расширения веб-сервера (wsap22.dll). Разберем методику «пустой функции», которую применили участники обсуждения. Создадим в HTTP-сервисе метод, который не выполняет никакой бизнес-логики, а сразу возвращает статус 200.
Функция ТестовыйЗапрос(Запрос)
// Записываем событие в Журнал регистрации для фиксации факта дохождения запроса
ЗаписьЖурналаРегистрации("HTTP.Тест", УровеньЖурналаРегистрации.Информация, , , "Запрос получен сервером 1С");
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("OK");
Возврат Ответ;
КонецФункции
Если при получении ошибки 500 в Журнале регистрации 1С отсутствует запись «Запрос получен сервером 1С», это однозначно указывает на то, что IIS прервал обработку запроса раньше, чем передал его в 1С. В этом случае копать код конфигурации бессмысленно — проблема в инфраструктуре.
Когда стандартные логи IIS (находящиеся обычно в C:\inetpub\logs\LogFiles) содержат лишь сухую запись об ошибке 500, проанализируем ситуацию с помощью инструмента Failed Request Tracing. Это самый мощный способ увидеть «внутреннюю кухню» обработки HTTP-пакета.
В отчете нас интересует раздел VIEW_TRACE_TOP. Если вы видите, что ошибка произошла на модуле IsapiModule, значит, проблема в загрузке или работе библиотеки 1С. Если же сбой произошел на WindowsAuthenticationModule, то причина в правах доступа или сетевых токенах.
При использовании Windows-аутентификации в корпоративной среде пользователи часто состоят во множестве групп Active Directory. Это приводит к раздуванию заголовка авторизации Authorization: Negotiate.... Если размер этого заголовка превышает лимиты HTTP.sys, сервер вернет ошибку до того, как 1С узнает о запросе.
Выясним причину, проверив параметры реестра на сервере IIS. Рассмотрим путь HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters. Попробуем увеличить следующие ключи (тип DWORD):
65536 (десятичное).65536 (десятичное).После внесения изменений в реестр обязательна перезагрузка сервера (или службы HTTP через net stop http / net start http), так как эти параметры считываются драйвером при старте.
Проанализируем настройки пула приложений (Application Pool), в котором работает публикация 1С. Одной из частых причин «временных» ошибок является Recycling (переработка) пула. Если пул настроен на частую перезагрузку по времени или по потреблению памяти, то в момент смены рабочих процессов w3wp.exe первые запросы могут получать 500-ю ошибку.
Важные настройки пула:
False. Как отмечено в обсуждении, включение 32-битного режима на 64-битной платформе гарантированно ведет к ошибке 500.Integrated (интегрированный режим).C:\Windows\Temp и права чтения/выполнения на папку bin платформы 1С.Поскольку сервис работает по HTTPS, IIS выполняет проверку валидности SSL-сертификата. Посмотрим на ситуацию с точки зрения сервера: если сертификат выдан внутренним центром сертификации (CA), IIS при каждом запросе пытается проверить список отзыва (CRL). Если у сервера нет доступа к контроллеру домена или внешней ссылке CRL, запрос может завершиться по таймауту с ошибкой 500.
Что нужно сделать:
wsap22.dll нестабильной под нагрузкой.Чтобы окончательно понять, что возвращает сервер, когда 1С выдает 500, проанализируем тело ответа на стороне вызывающего сервера. Часто IIS передает в теле ответа подробное описание ошибки (например, «Module: IsapiModule, Notification: ExecuteRequestHandler»), которое мы не видим в обычном логе.
Попытка
Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
Если Ответ.КодСостояния <> 200 Тогда
// Читаем тело ошибки 500, там может быть важная информация от IIS
ТекстОшибки = Ответ.ПолучитьТелоКакСтроку("UTF-8");
ЗаписьЖурналаРегистрации("HTTP.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
КонецЕсли;
Исключение
Инфо = ИнформацияОбОшибке();
// Обработка сетевых исключений
КонецПопытки
Нехватка прав на создание временных файлов — одна из самых неочевидных причин спорадических ошибок 500. При Windows-аутентификации может происходить олицетворение (Impersonation). Это значит, что 1С пытается работать под правами того пользователя, который обратился к сервису. Если у этого пользователя нет прав на системную временную папку или папку с конфигурацией 1С (при файловом варианте), возникнет ошибка. Проанализируем права доступа для группы Users или IIS_IUSRS на папку C:\Windows\Temp — они должны быть достаточными для записи и удаления файлов.