Доброго времени суток. Сделал свой HTTP-сервис на 1С. Вопрос (возможно "тупой"): можно ли как-то получить IP-адрес устройства с которого был сделан запрос? Все запросы выполняются в локальной сети. Заранее спасибо.
(1) Никогда не поднимал свои http сервисы, тем более средствами 1с, мб сейчас попробую.
На вскидку предлагаю посмотреть в заголовки запроса (HTTPСервисЗапрос.Заголовки)
А на HTTP сервере
# если нет заголовка X-Forwarded-For (без proxy), то создать заголовок Ext-Remote-Addr
# со значением %{REMOTE_ADDR}, т.е. IP клиента
Options FollowSymLinks
RewriteEngine On
RewriteRule .* - [E=RA]
RewriteCond %{HTTP:X-Forwarded-For} =""
RewriteRule .* - [E=RA:%{REMOTE_ADDR}]
#RequestHeader set Ext-Remote-Addr: "%{RA}e" env=RA
#RequestHeader set Med-Remote-Addr: "%{RA}e" env=RA
# если есть заголовок X-Forwarded-For, то создать заголовок Ext-Remote-Addr
# со значением 1-го IP адреса, т.е. самого первого клиента в цепочке proxy
#RewriteRule .* - [E=RAb]
RewriteCond %{HTTP:X-Forwarded-For} !=""
RewriteCond %{HTTP:X-Forwarded-For} "(([0-9]{1,3}\.){3}[0-9]{1,3})"
RewriteRule .* - [E=RA:%1]
#RequestHeader set Ext-Remote-Addr: "%{RAb}e" env=RAc
#RequestHeader set Med-Remote-Addr1: "%{RAb}e" env=RA
RequestHeader set Med-Remote-Addr: "%{RA}e"
А в 1с из заголовков брать значение Ext-Remote-Addr
попробовал свой сервис погонять ничего не нашел похожего на ip адрес с которого идет отправка думаю что нет.
в журнале регистрации тоже пусто только имя пользователя от которого подключился.
правда можно попробовать через ПолучитьСоединенияИнформационнойБазы() но там необходимо делать фильтр по пользователю
(6) Это все хорошо когда http get приходит с соседней машины, по wins её найти - полбеды. Но http сервис, наверное, поднимается не для тех кто сидит под бочком, а для тех, кто как смерть кощея: за 100500 натами, без дмз, с фаерволами и вот этим всем :3
Алсо, если не изменяет память, по дефолту на винде включен фаервол, который не пускает пинг.
Скорее всего напрямую из 1С такую информацию не получить, так как запрос 1С получает от веб-сервера. Только если какой-то костыль городить, чтобы веб-сервер где-то сохранял инфу по подключившимся, и 1С её потом разбирала (если это вообще возможно).
Решал подобную задачу.
Похоже, что на стороне сервера, где выполняется обработка HTTP запроса получить айпишник, с которого этот запрос пришёл никак не получится.
Предлагают лезть в журнал регистрации IIS и там пытаться парсить айпишник.
Но от такое решение заведомо кривое, на мой взгляд.
Я не нашёл ничего лучшего, чем получать IP на клиенте и передавать его в параметрах HTTP запроса.
Но здесь тоже не всё гладко.
Не говоря уже о том, что настройки, которые выдаёт IPCONFIG из 1С также не получишь.
А главное, эти настройки выдают настройки локальных сетевых интерфейсов, а учитывая что в большинстве случаев для доступа к интернет используется роутер, внешний IP получить таким образом не удастся.
В итоге, решено было для получения внешнего IP использовать API сторонних сервисов.
Нашёл только один такой сервис Среди сервисов выбрал "Провайдер-IP API".
Привожу код реализации:
Функция ПолучитьПараметрыСоединения()
Попытка
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html");
HTTPЗапрос = Новый HTTPЗапрос("api.2ip.ua/provider.json?ip=");
HTTPСервис = Новый HTTPСоединение("api.2ip.ua",,,,,,Новый ЗащищенноеСоединениеOpenSSL);
HTTPСервис.Получить(HTTPЗапрос, ИмяВременногоФайла);
Файл = Новый Файл(ИмяВременногоФайла);
Если Файл.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла);
ТекстСтраницы = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
ИсходныйТекст = ТекстСтраницы;
ИсходныйТекст = СтрЗаменить(ИсходныйТекст, "{", "");
ИсходныйТекст = СтрЗаменить(ИсходныйТекст, "}", "");
ИсходныйТекст = СтрЗаменить(ИсходныйТекст, """", "");
СписокПараметров = СтрРазделить(ИсходныйТекст, ",");
СоответствиеПараметров = Новый Соответствие;
Для каждого КлючИЗначение Из СписокПараметров Цикл
ТекПараметр = СтрРазделить(СокрЛП(КлючИЗначение.Значение), ":");
Если ТекПараметр.Количество() = 2 Тогда
СоответствиеПараметров.Вставить(СокрЛП(ТекПараметр[0].Значение), СокрЛП(ТекПараметр[1].Значение));
КонецЕсли;
КонецЦикла;
Если СоответствиеПараметров.Получить("ip") <> Неопределено Тогда
СоответствиеПараметров.Вставить("connection_string", ТекстСтраницы);
Возврат СоответствиеПараметров;
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
КонецФункции // ПолучитьПараметрыСоединения()