2013-02-24 4 views
2

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

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

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

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

+0

Страница рендеринга просто в IE, достаточно ли расширен WebBrowser? Может быть, попробуйте максимизировать окно? –

ответ

3

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

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

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

+0

+1 Я надеюсь, что это тоже решает проблемы с рендерингом - звучит многообещающе! –

Смежные вопросы