С# и 1С. Вызов RemoteCertificateValidationCallback в фоновом задании

1. held88 59 19.10.17 09:20 Сейчас в теме
Добрый день! Написал компоненту. Есть там такой код.

AMQMessage message = new AMQMessage();
 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://" + Server + ":" + Port + "/v1/peek/" + Ресурс + ".json");
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
            request.Credentials = new NetworkCredential(login, pass);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            StreamReader responseReader = new StreamReader(response.GetResponseStream());
            message.Строка = responseReader.ReadToEnd();
            message.Код = (int)response.StatusCode;
            message.КодСообщения = response.Headers["Jmsmessageid"];

            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(AMQMessage));
            MemoryStream stream = new MemoryStream();
            
            jsonSerializer.WriteObject(stream, message);
            byte[] json = stream.ToArray();
   
            stream.Close();

            return Encoding.UTF8.GetString(json, 0, json.Length);
Показать


И если эту процедуру вызвать по нажатию кнопки на форме, то все замечательно отрабатывает. А вот если вызвать данную процедуру в фоновом задании, получаю ошибку. Время ожидания истекло.

Что-то не могу понять в чем разница, почему не отрабатывает в фоновом задании. И как быть если кто-то может подсказать.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex_sh2008 4 19.10.17 09:23 Сейчас в теме
(1)У той машины где запускается компонента нет доступа к этому адресу
3. held88 59 19.10.17 09:28 Сейчас в теме
(2) Такого быть не может просто потому что не может быть. Я запускаю клиент на этой же машине и если вызов идет с клиента то все отрабатывает, а если вызов делает фоновое задание, то не отрабатывает. Доступ с этой машины к ресурсу есть - это 100%.
4. alex_sh2008 4 19.10.17 09:34 Сейчас в теме
(3)Какие параметры передаются в компоненту когда вызывается во фоновом задании, можете трассировку сделать на уровне компоненты.
5. held88 59 19.10.17 09:43 Сейчас в теме
(4)У меня в этой же компоненте идет обращение к базе данных SQL и все работает. А вот именно с https запросом фигня какая то. Данные в компоненту передаются только строковые. Это адрес сервера и так далее. Трассировку на уровне компоненты? Это мне MS Romote Debbuger поставить на сревак надо. Ну я почему то уверен что он на колбэке зависает.
9. alex_sh2008 4 19.10.17 11:02 Сейчас в теме
(5)
Трассировку на уровне компоненты?

Не надо ставить ничего, пропишите в коде журнализацию в файл, и туда же засуньте полученные параметры от 1С, тут как вариант может быть проблема с кодировкой и форматированием цифровых значений в строку. А сама то компонента инициализируется в фоновом задании?
6. dmpas 418 19.10.17 09:43 Сейчас в теме
(3)
Доступ с этой машины к ресурсу есть - это 100%.

а доступ у пользователя, под которым служба 1С запущена?
7. held88 59 19.10.17 10:08 Сейчас в теме
(6) Ерунда это все. Стартовал сервер под тем же пользователем под которым запускаю клиент. Эффекта ноль.
8. held88 59 19.10.17 10:54 Сейчас в теме
Все таки я вас дезинформировал. Клиент запускался с терминального сервера. Он не является сервером 1С. Запустил клиент на сервере 1С картина такая же как с фоновым заданием. Тот код что я опубликовал выше выполняется в цикле и на третей итерации возвращает ошибку о превышении времени ожидания. То есть дважды он нормально получает доступ, а на третий раз проблема. При этом на сервере терминалов все отрабатывает отлично. Значит дело все таки в настройке сервера 1С. Ума не приложу что смотреть. Подскажите пож.
10. alex_sh2008 4 19.10.17 11:05 Сейчас в теме
(8)Ну раз так то вы должны делать паузу между вызовами, если конечно не прописан многопоточный веб сервис.
11. held88 59 19.10.17 11:23 Сейчас в теме
(10) Там тысячи сообщений с рест сервера надо загрузить. Если я буду делать паузы... Дело то в том что с другой машины отрабатывает нормально. Брандмауэр может определять это типо как зловредный трафик и блокировать?
12. alex_sh2008 4 19.10.17 11:47 Сейчас в теме
(11)Загружайте пакетами, к примеру по 500 сообщений в одном пакете. Тут скорее всего сама ОС блокирует из за сильной активности не известного трафика, нужно смотреть журнал безопасности, в нем должны быть записи отказа.
13. held88 59 19.10.17 12:33 Сейчас в теме
(12) В журналах пусто. Если делать запрос к рест серверу средствами 1С - то все замечательно работает. Если же делать запрос из компоненты, то делается два запроса, на третий таймаут. В журналах и клиента и сервера пусто. Блокировка я так понимаю происходит средствами .net чтоли так как средствами 1с все работает.
14. alex_sh2008 4 19.10.17 12:45 Сейчас в теме
(13)Сложно сказать, код net в несколько раз быстрее работает чем код 1С, возможно сервер 1С не успевает отрабатывать.
15. held88 59 19.10.17 13:18 Сейчас в теме
(14) Уряяяяяяяяяяяяяяя!!!!!

responseReader.Close();
responseReader.Dispose();
stream.Close();
stream.Dispose();
response.Close();

Теперь работает.
И действительно быстрее работает чем код 1С!!!
16. alex_sh2008 4 19.10.17 15:44 Сейчас в теме
(15)Лучше еще добавить код проверки доступности веб сервиса перед каждым запросом
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот