InternetOpenUrl время от времени истекает - PullRequest
0 голосов
/ 31 августа 2010

У меня есть несколько запросов InternetOpenUrl, которые странным образом истекают.Конечная точка есть, и URL-адрес правильный.Это происходит в синхронном цикле внутри элемента управления activex, и примерно в 6-й раз он запускается, тайм-аут без попадания на сервер.

HINTERNET hINet = InternetOpen(TEXT("InetURL/1.0"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
/*hangs*/ HINTERNET hFile = InternetOpenUrl( hINet, url.c_str(), headers, headersLen, dwFlags, dwContext);

GetLastError просто возвращает 12002 тайм-аут операции.Вот полный фрагмент: http://gist.github.com/559317

Интересно, что если я изменю флаг InternetOpen на INTERNET_OPEN_TYPE_DIRECT, а fiddler НЕ запущен, я получаю ошибку (после нескольких успешных запросов), и если я запускаю fiddler,все запросы выполняются успешно.

до сих пор это реплицировалось на Win7 / IE8 и Vista64 / IE8, XP / IE6

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

Вы почти наверняка достигнете предела "Соединения на хост" в WinINET.

Вы можете иметь только определенное количество запросов к одному хосту, работающему параллельно, в соответствии с соединениями на хост, СЛЕДУЕТ в RFC2616. Когда ограничение будет достигнуто, WinINET будет помещать в очередь ожидающие запросы, пока существующее соединение не станет доступным. Если до истечения времени ожидания соединение не становится доступным, время ожидания запроса истекает.

WinINET реализует это ограничение для каждой конечной точки, поэтому, когда вы работаете с прокси-сервером (таким как Fiddler, ISA, SQUID и т. Д.), Вы можете иметь максимум «n» соединений одновременно если прокси-сервер отсутствует, вы можете иметь максимум «n» подключений к каждому имени хоста.

Если ваш элемент ActiveX не освобождает соединение должным образом после завершения ответа, вы можете решить эту проблему. Как правило, запуск Fiddler не должен «исправлять» это для вас, но вы можете использовать NetMon, чтобы проверить, что происходит.

1 голос
/ 21 сентября 2010

ОК, поэтому я изначально думал, что EricLaw был прав, и прокомментировал: «Моя конкретная проблема заключалась в том, что у меня возникали вызовы javascript ajax после каждого вызова элемента управления ajax. Это создает условие гонки, и в итоге 4 вызова javascript ajax не вернулись, когда я сделал ajax-вызов внутри элемента управления (да, я исказил свое окружение в исходном вопросе) "

этот комментарий неверен.

проблема на самом деле обсуждаемая проблема здесь :

"У вашего элемента управления ActiveX есть общий дефект - однопоточная квартира (STA) объекты ActiveX и COM должны избегать: COM-объекты STA не могут выполнять операции блокировки на потоке STA, если объект COM также не перекачивает Сообщения Windows. Поэтому, если ваш контроль должен выполнять синхронный блокируя операцию, он должен реализовать Windows Message Pump, а ожидание завершения операции блокировки. "

это решило проблему (и открыло новую банку с червями). если вы столкнетесь с этим, вы можете прокомментировать здесь, и я объясню лучше.

0 голосов
/ 01 сентября 2010

В комментарии ivymike я посмотрел флаги InternetOpenUrl и увидел один, который я пропустил;INTERNET_FLAG_PRAGMA_NOCACHE

Обновление: этот флаг не решил проблему.Я рассматриваю возможность переноса из WinINet (InternetOpenUrl) в WinHTTP, чтобы обойти поведение кэширования.

(перенос WinINet в WinHTTP) http://msdn.microsoft.com/en-us/library/aa384068(VS.85).aspx

...