Элемент управления WebBrowser, выполняющийся из-за проблемы со службой - PullRequest
2 голосов
/ 26 июля 2010

Хорошо, вот в чем дело - я запускаю элемент управления Windows Forms WebBrowser из службы. Я знаю, что нет-нет, но, похоже, все в порядке.

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

while (browser.readystate != complete)
Application.DoEvents()

Очевидно, что это не будет работать от службы.

Я пробовал это как альтернативу:

public class WebCrawler
{
    private class ExposedActiveXWebBrowser : System.Windows.Forms.WebBrowser
    {
        public SHDocVw.WebBrowser UnderlyingWebBrowser
        {
            get
            {
                return ActiveXInstance as SHDocVw.WebBrowser;
            }
        }
    }
    ExposedActiveXWebBrowser worker;

    public WebBrowserReadyState ReadyState
    {
        get
        {
            return worker.ReadyState;
        }
    }

    public HtmlDocument Document
    {
        get
        {
           return worker.Document;
        }
    }

    public WebCrawler()
    {
        worker = new ExposedActiveXWebBrowser();
    }

    public void Navigate(string urlString)
    {
        worker.Navigate(urlString);
        while (worker.UnderlyingWebBrowser.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
            Thread.Sleep(0);
    }
}

Этот метод Navigate, однако, не работает. ReadyState никогда не меняется от LOADING.

Что мне интересно, так это то, что веб-браузеры форм Windows кажутся по своей сути асинхронными, значит ли это, что элемент ActiveX уже выполняется в своем собственном потоке?

Могу ли я, получив доступ к базовому элементу управления activex через соответствующий интерфейс, просто подождать его завершения?

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

Решение: мне нужно было запустить службу как пользователь с полным доверием. это явно требуется через атрибут PermissionSet.

2 голосов
/ 26 июля 2010

Вы можете попробовать событие DocumentCompleted .

Из MSDN:

Происходит, когда элемент управления WebBrowser заканчивает загрузку документа.

...

Обработка события DocumentCompleted для получения уведомления о завершении загрузки нового документа.Когда происходит событие DocumentCompleted, новый документ полностью загружается, что означает, что вы можете получить доступ к его содержимому через свойство Document, DocumentText или DocumentStream.

1 голос
/ 26 июля 2010

Поскольку ваш класс называется WebCrawler, могу ли я предположить, что этот сервис запрашивает HTML и что-то с ним делает?

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

Например System.Net.WebClient и System.Net.HttpWebRequest

0 голосов
/ 26 июля 2010

+ 1 для Криса - Если вы не видите WebControl, зачем вам его рендерить?Используйте что-то вроде HTMLAgilityPack , чтобы при необходимости проанализировать модель DOM для страницы.

...