Как настроить HTTP-запросы с Basic-авторизацией и SSL через NetObjectToIDispatch45

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

При интеграции 1С с внешними веб-сервисами стандартных средств HTTPСоединение не всегда достаточно, особенно когда требуется тонкая настройка протоколов безопасности или специфическое управление заголовками. В таких случаях разработчики часто прибегают к использованию библиотеки NetObjectToIDispatch45, которая позволяет обращаться к мощностям .NET Framework (в частности, к классу HttpClient) напрямую из кода 1С. Однако при настройке авторизации и защищенных соединений возникают нюансы, которые могут привести к ошибкам «Не удалось создать защищенный канал SSL/TLS» или отказам сервера в доступе.

В этой статье мы подробно рассмотрим, как правильно настроить HttpClient для работы с Basic-авторизацией, как принудительно включить поддержку современных протоколов TLS и как корректно передавать JSON-данные.

Настройка протоколов безопасности TLS

Одной из наиболее частых проблем при выполнении HTTPS-запросов является несовместимость протоколов безопасности. По умолчанию старые версии .NET Framework могут пытаться использовать SSL 3.0 или TLS 1.0, которые сегодня считаются небезопасными и отключаются на стороне серверов. Это приводит к ошибке установления защищенного соединения.

Проанализируем ситуацию: чтобы запрос прошел успешно, нам нужно явно указать ServicePointManager, какие протоколы мы разрешаем использовать. Разберем по шагам, как это реализовать через обертку NetObjectToIDispatch45:


// Получаем типы из .NET для настройки безопасности
ServicePointManager = NetObject.ПолучитьТип("System.Net.ServicePointManager");
SecurityProtocolType = NetObject.ПолучитьТип("System.Net.SecurityProtocolType");

// Комбинируем протоколы через логическое ИЛИ (OR)
// Включаем Ssl3, Tls, Tls11 и Tls12
ServicePointManager.SecurityProtocol = NetObject.OR(
    SecurityProtocolType.Ssl3, 
    SecurityProtocolType.Tls, 
    SecurityProtocolType.Tls11, 
    SecurityProtocolType.Tls12
);

Важный момент: Если ваш сервер требует современный протокол TLS 1.3, а в перечислении SecurityProtocolType он отсутствует (так как библиотека была собрана под старую версию .NET), вы можете передать его числовое значение. Для TLS 1.3 это 12288.

Реализация Basic-авторизации

Basic-авторизация подразумевает передачу логина и пароля в заголовке запроса в кодировке Base64. Хотя в .NET существует объект NetworkCredential, он не всегда срабатывает «превентивно». HttpClient по умолчанию ожидает от сервера ошибку 401, чтобы отправить данные во втором запросе. Многие API блокируют такие запросы сразу. Поэтому надежнее всего устанавливать заголовок Authorization вручную.

Рассмотрим, как правильно сформировать заголовок, используя UTF-8 кодировку, чтобы избежать проблем с кириллицей в паролях или именах пользователей:


// Подготовка данных авторизации
ЛогинПароль = Объект.Логин + ":" + Объект.Пароль;

// Получаем объект для работы с кодировкой UTF8
Encoding = NetObject.ПолучитьТип("System.Text.Encoding");
UTF8Encoding = Encoding.UTF8;

// Преобразуем строку в массив байтов
Bytes = UTF8Encoding.GetBytes(ЛогинПароль);

// Преобразуем массив байтов в Base64-строку
Convert = NetObject.ПолучитьТип("System.Convert");
Base64String = Convert.ToBase64String(Bytes);

// Устанавливаем заголовок авторизации в HttpClient
Client.DefaultRequestHeaders.Authorization = NetObject.СоздатьОбъект(
    "System.Net.Http.Headers.AuthenticationHeaderValue", 
    "Basic", 
    Base64String
);

Выясним причину, почему это лучше: ручная установка заголовка гарантирует, что данные авторизации уйдут с первым же пакетом данных (Preemptive Authentication), что значительно сокращает время ожидания и снижает нагрузку на сеть.

Правильное формирование контента (JSON)

При отправке POST-запросов критически важно указать правильный тип контента (Content-Type), иначе сервер может не понять, что вы прислали JSON, и вернет ошибку 400 или 415. Рассмотрим правильный способ инициализации StringContent:


// Предположим, у нас есть строка JSON
СтрокаJSON = "{""inn"":""6140038703""}";

// Создаем объект контента с указанием кодировки и типа MIME
StringContent = NetObject.ПолучитьТип("System.Net.Http.StringContent");
// Используем конструктор: StringContent(String, Encoding, MediaType)
Контент = NetObject.СоздатьОбъект(StringContent, СтрокаJSON, UTF8Encoding, "application/json");

// Выполняем запрос
Результат = Client.PostAsync(requestUri, Контент).Result;

Проанализируем ситуацию с чтением ответа. Даже если запрос завершился неудачей, сервер часто присылает полезную информацию в теле ответа. Мы можем прочитать её следующим образом:


Если Результат.IsSuccessStatusCode Тогда
    ОтветТекст = Результат.Content.ReadAsStringAsync().Result;
    Сообщить("Успех: " + ОтветТекст);
Иначе
    ОшибкаТекст = Результат.Content.ReadAsStringAsync().Result;
    Сообщить("Ошибка сервера (" + Результат.StatusCode + "): " + ОшибкаТекст);
КонецЕсли;

Дополнительные настройки для стабильной работы

При работе в корпоративных сетях или при выполнении большого объема запросов, следует учитывать еще несколько параметров:

  1. Отключение заголовка 100-Continue: По умолчанию .NET ждет подтверждения от сервера перед отправкой тела запроса. Это часто вызывает задержки. Рекомендуется отключать это: ServicePointManager.Expect100Continue = Ложь;.
  2. Таймауты: Устанавливайте явный таймаут для HttpClient, чтобы сессия 1С не «зависала» при проблемах со связью. Например: Client.Timeout = NetObject.СоздатьОбъект("System.TimeSpan", 0, 0, 30); (30 секунд).
  3. Использование Cookies: Если сервер требует поддержки сессий через куки, используйте HttpClientHandler с включенным CookieContainer.

Рассмотрим пример настройки HttpClientHandler с поддержкой сжатия данных (GZip), что может ускорить обмен при больших объемах JSON:


HttpClientHandlerType = NetObject.ПолучитьТип("System.Net.Http.HttpClientHandler");
DecompressionMethods = NetObject.ПолучитьТип("System.Net.DecompressionMethods");

handler = NetObject.СоздатьОбъект(HttpClientHandlerType);
handler.AutomaticDecompression = NetObject.OR(DecompressionMethods.GZip, DecompressionMethods.Deflate);

// Теперь создаем клиент с этим обработчиком
Client = NetObject.СоздатьОбъект(HttpClient, handler);

Таким образом, мы проанализировали основные этапы настройки HTTP-запросов через NetObjectToIDispatch45. Использование ручного формирования заголовков авторизации в сочетании с правильной настройкой ServicePointManager позволяет решать практически любые задачи интеграции с внешними REST API, обеспечивая стабильность и безопасность соединения.

← На главную