Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Асинхронные WinHttp.WinHttpRequest.5.1 и MSXML2.XMLHTTP

Асинхронные WinHttp.WinHttpRequest.5.1 и MSXML2.XMLHTTP
Я
   qwerty
 
24.01.16 - 12:29
Платформа 8.3.7, УФ

Хочу асинхронно получить данные с сайта. При использовании WinHttp.WinHttpRequest.5.1:

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");

ДобавитьОбработчик WinHttp.OnError, http_OnError;
ДобавитьОбработчик WinHttp.OnResponseDataAvailable, http_OnResponseDataAvailable;
ДобавитьОбработчик WinHttp.OnResponseFinished, http_OnResponseFinished;
ДобавитьОбработчик WinHttp.OnResponseStart, http_OnResponseStart;

WinHttp.Open("GET", "https://btc-e.com/api/3/ticker/btc_usd";, Истина);
WinHttp.Send();

1с вылетает при наступлении события.

При использовании MSXML2.XMLHTTP

XmlHttp = Новый COMОбъект("MSXML2.XMLHTTP");
ДобавитьОбработчик XmlHttp.OnReadyStateChange, http_OnReadyStateChange;

пишет Событие объекта не обнаружено (OnReadyStateChange)

ЧЯДНТ?
   spock
 
1 - 24.01.16 - 12:55
(0)биржа открывается браузером? Может провайдер блокирует трафик?
   spock
 
2 - 24.01.16 - 12:57
   qwerty
 
3 - 24.01.16 - 16:04
Сайт открывается. Синхронно все работает, не работает именно асинхронно
   qwerty
 
4 - 24.01.16 - 16:49
Я так понимаю, больше нет способов получить данные с сайта асинхронно?
   Serginio1
 
5 - 24.01.16 - 17:07
   Serginio1
 
6 - 24.01.16 - 17:08
   Lexey_
 
7 - 24.01.16 - 17:31
(4) фоновое задание
   Lexey_
 
8 - 24.01.16 - 17:39
+(7) + HTTPЗапрос и HTTPСоединение
   qwerty
 
9 - 24.01.16 - 18:21
(7) Было через фоновное сделано. В файловом варианте фоновые как нужно не работают.
   Serginio1
 
10 - 24.01.16 - 19:57
   Serginio1
 
11 - 24.01.16 - 20:39
(0) Если нужно помочь то обращайся
   qwerty
 
12 - 24.01.16 - 21:24
(11) Не планировал .net применять. Хочу разобраться с указанными объектами.
   Serginio1
 
13 - 24.01.16 - 21:48
Ну если не получится обращайся. .Net ничем не хуже MSXML2.XMLHTTP даже возможностей больше
   Serginio1
 
14 - 24.01.16 - 21:55
(12) А можешь объяснить почему не планируешь?
   qwerty
 
15 - 25.01.16 - 10:18
Апну разок, может будут у кого идеи. Если нет, то буду пробовать способ от Serginio1
   Serginio1
 
16 - 25.01.16 - 10:21
(15) Набросал на скору руку правда для обычного приложения

http://files.rsdn.ru/19608/%d0%a2%d0%b5%d1%81%d1%82WebClient.zip

Ну и NetObjectToIDispatch для него
http://files.rsdn.ru/19608/%d0%a4%d0%b0%d0%b9%d0%bb%d1%8bNetObjectToIDispatch.zip
   qwerty
 
17 - 25.01.16 - 11:14
Не заработало

{Форма.ФормаОтчета.Форма(4)}: Метод объекта не обнаружен (СоздатьОберткуДляСобытий)
ОберткаСобытий=врап.СоздатьОберткуДляСобытий(объект);

dll зарегестрирована
   Serginio1
 
18 - 25.01.16 - 11:23
А какую DLL регистрировал?
Попробуй \Тест\ФайлыNetObjectToIDispatch\NetObjetToIDispatch45\NetObjetToIDispatch45\bin\Debug\

Может я оставил старую в
Тест\ФайлыNetObjectToIDispatch\DLLNetObjetToIDispatch45\

Сейчас выложу последнюю без SignalR
   Serginio1
 
19 - 25.01.16 - 11:27
   Serginio1
 
20 - 25.01.16 - 11:29
Да и запусти из толстого клиента
   qwerty
 
21 - 25.01.16 - 11:32
С этой заработало. Запускаю пока из толстого клиента.
Но, есть небольшая проблема. Делаю изменения в обработке, сохраняю, переоткрываю обработку в предприятии - изменений не видно. Изменения появляются только когда перезапускаешь предпрятие. Наверное, созданные объекты подвисают...
   Serginio1
 
22 - 25.01.16 - 11:58
Попробуй
Процедура ПриЗакрытии()
    // Вставить содержимое обработчика.

    Врап.ОчиститьСобытияОбъекта(Клиент);
    Врап.ОчиститьСобытияОбъекта(ОберткаСобытий);
    ОберткаСобытий=Неопределено;
    Клиент.Dispose();
    Клиент=Неопределено;
    GC=Врап.ПолучитьТип("System.GC");
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Врап= Неопределено;

КонецПроцедуры
   Serginio1
 
23 - 25.01.16 - 12:01
Да там еще в
   Процедура DownloadProgressChanged(Данные)
               Сообщить("DownloadProgressChanged "+Врап.ВСтроку(Данные));
                e=Данные.e;

// Почему то последний парамер это Objec[]

// Просто добавь доплнительный параметр

               Сообщить(String.Format("загружено {0} из {1} байт. {2}  % complete...", 
        e.BytesReceived, 
        e.TotalBytesToReceive,
        e.ProgressPercentage,
        0));
        
// Или можно вызвать метод

         Сообщить(Врап.ВыполнитьМетод(String,"Format","загружено {0} из {1} байт. {2}  % complete...", 
        e.BytesReceived, 
        e.TotalBytesToReceive,
        e.ProgressPercentage));
            КонецПроцедуры
   Serginio1
 
24 - 25.01.16 - 12:32
Только зачем тебе асинхронно? Там данные быстро получаются.
Просто при первом вызове происходит компиляция. Последующие вызовы мгновенны
   qwerty
 
25 - 25.01.16 - 13:06
(24) Сайт отдает данные где-то через 1 сек. На это время форма "подвисает" и работать не комфортно.
   Serginio1
 
26 - 25.01.16 - 13:26
(25) То есть у тебя в фоне через таймер данные подгружаются?
   Serginio1
 
27 - 25.01.16 - 14:48
Там несложно переделать и на УФ, просто у меня генерируются методы для толстого клиента. Можешь сам посмотреть в обработке ТестСобытийИзмененийВДиректории.epf там генерируются модули. В том числе можно использовать ОбработкаВнешнегоСобытия

Для WebClient вводишь В поле Полное имя файла System.Net.WebClient и жмакаешь на "Получить описание модулей"
   Serginio1
 
28 - 25.01.16 - 16:28
Да еще после создания установи
Клиент.Encoding = Врап.ПолучитьТип("System.Text.Encoding").UTF8;

Иначе будешь работать с кодировкой по умолчанию 1251
   Serginio1
 
29 - 28.01.16 - 11:57
Добавил класс для выполнения асинхронно асинхронных методов
Использование классов .Net в 1С для новичков


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.