Элемент управления WebBrowser не отображает некоторые страницы

Я работаю над приложением, которое содержит элемент управления WebBrowser и сохраняет скриншоты веб-страниц. (C #, VS2008, IE 9, Vista. Все обновлены. Для параметра FEATURE_BROWSER_EMULATION установлено значение 0x2328)

Приложение берет список URL-адресов и переходит к ним один за другим и сохраняет снимки экрана. Поток приложения выглядит следующим образом: прочтите URL-адрес из файла, сначала получите его с помощью HttpWebRequest, если он существует и если это html вызовите webBrowser.Navigate (url), дождитесь, пока WebBrowser.ReadyState не станет WebBrowserReadyState.Complete (обработайте события WebBrowser.DocumentCompleted и просто ничего не делайте, пока ReadyState не станет WebBrowserReadyState.Complete), подождите еще несколько секунд, чтобы быть в безопасности (проверено до 10 секунд), сохраните снимок экрана и перейдите к следующему URL-адресу. Он работает правильно почти для всех URL-адресов (страниц с разных сайтов), но встроенный в мое приложение WebBrowser не отображает некоторые URL-адреса, особенно страницы с www.securityfocus.com, например: http://www.securityfocus.com/bid/52023

Я попытался отключить кеш, очищать кеш перед каждым запросом, подождать до 10 секунд, чтобы дать ему время для рендеринга и т. Д., Но безрезультатно. Я визуально подтвердил, что WebBrowser не отображает страницу, это не проблема, связанная с сохранением снимка экрана (я использую BitBlt, но не думаю, что это актуально). Страница обычно отображается с использованием IE.

Пожалуйста, дайте мне знать, если у вас есть какие-либо рекомендации относительно того, почему это происходит. заранее спасибо


person Serkan Özkan    schedule 24.02.2013    source источник
comment
Страница отлично отображается в IE, достаточно ли расширен WebBrowser? Может, попробовать развернуть окно до максимума?   -  person Hanlet Escaño    schedule 25.02.2013


Ответы (1)


Мне удалось решить эту проблему! Оказалось, что веб-браузеру требуется небольшое количество времени для фактического отображения страницы после срабатывания последнего события DocumentCompleted. Обычно мы не замечаем эту небольшую задержку, но когда у вас есть цикл, запущенный сразу после последнего (многие события DocumentCompleted будут запущены при загрузке URL-адреса) DocumentCompleted для страницы, веб-браузер не может найти время для отображения страницы, прежде чем вы сохраните Снимок экрана, поэтому вам нужно дать ему время, чтобы отобразить страницу.

Если вы наивно вызываете засыпание в потоке пользовательского интерфейса, чтобы дождаться рендеринга, рендеринг также перейдет в спящий режим, и страница не будет отрисована до того, как вы сохраните снимок экрана.

Таким образом, вам нужно подождать в другом потоке, оставить поток пользовательского интерфейса незанятым, чтобы дать время для завершения рендеринга страницы, а затем вернуться в поток пользовательского интерфейса из дочернего потока, вызвав метод Invoke в основном потоке пользовательского интерфейса.

person Serkan Özkan    schedule 27.02.2013
comment
+1 Надеюсь, это решит и мои проблемы с рендерингом - звучит многообещающе! - person John Faulkner; 08.07.2013