2

わかりました、これが取り引きです - 私はWebBrowserサービスから Windows フォーム コントロールを実行しています。私はそれがノーノーであることを知っていますが、うまくいくようです.

私が問題に直面しているのは、ブラウザのページが読み込まれるのを待つことだけです。通常のアプリケーションでは、次のようなことをするだけです

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 フォームの WebBrowsers は本質的に非同期のように見えるということです。これは、ActiveX コントロールが独自のスレッドで既に実行されているということですか?

適切なインターフェイスを介して基になる ActiveX コントロールにアクセスして、完了するまで待つことはできますか?

4

4 に答える 4

2

解決策:完全に信頼できるユーザーとしてサービスを実行する必要がありました。PermissionSet属性を介して明示的に必要です。

于 2010-08-03T22:20:18.440 に答える
2

DocumentCompletedイベントを試すことができます。

MSDNから:

WebBrowserコントロールがドキュメントのロードを終了したときに発生します。

..。

DocumentCompletedイベントを処理して、新しいドキュメントの読み込みが完了したときに通知を受け取ります。DocumentCompletedイベントが発生すると、新しいドキュメントが完全に読み込まれます。つまり、Document、DocumentText、またはDocumentStreamプロパティを介してそのコンテンツにアクセスできます。

于 2010-07-26T17:33:25.697 に答える
1

あなたのクラスはWebCrawlerと呼ばれているので、このサービスがHTMLを要求し、それを使って何かをしていると思いますか?

その場合は、これを行うために使用するより良いクラスがあり、この問題は発生しません。

などSystem.Net.WebClientSystem.Net.HttpWebRequest

于 2010-07-26T17:12:17.183 に答える
0

クリスの+1-WebControlが表示されない場合、なぜそれをレンダリングしたいのですか?必要に応じて、 HTMLAgilityPackなどを使用して、ページのDOMモデルを解析します。

于 2010-07-26T17:18:39.620 に答える