C# 从服务问题执行WebBrowser控件

C# 从服务问题执行WebBrowser控件,c#,windows-services,.net-2.0,browser,shdocvw,C#,Windows Services,.net 2.0,Browser,Shdocvw,好的,这里是交易-我正在运行一个服务的Windows窗体WebBrowser控件。我知道这是一个不,但它似乎工作的好 我遇到的唯一问题是试图等待浏览器的页面加载。在一个普通的应用程序中,我只需要做如下的事情 while (browser.readystate != complete) Application.DoEvents() 显然,这在服务中不起作用 我尝试过将此作为备选方案: public class WebCrawler { private class ExposedActiv

好的,这里是交易-我正在运行一个服务的Windows窗体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);
    }
}
然而,这种导航方法不起作用。ReadyState在加载后不会更改

我想知道的是,Windows窗体Web浏览器似乎天生就是异步的,那么这是否意味着ActiveX控件已经在自己的线程上执行了呢


我可以通过适当的接口访问底层activex控件,等待它完成吗?

由于您的类被称为WebCrawler,我可以假定此服务请求HTML并对其进行处理吗

如果是这样的话,那么就有更好的类来实现这一点,你就不会有这个问题了


例如System.Net.WebClient和System.Net.HttpWebRequest

+1 for Chris-如果看不到WebControl,为什么要渲染它?如果需要,可以使用类似的方法为页面解析DOM模型。

您可以尝试该事件

从MSDN:

在WebBrowser控件完成加载文档时发生


处理DocumentCompleted事件以在新文档完成加载时接收通知。当DocumentCompleted事件发生时,新文档将完全加载,这意味着您可以通过document、DocumentText或DocumentStream属性访问其内容。

解决方案:我需要以完全信任的用户身份运行服务。它是通过PermissionSet属性明确要求的。

是的,我已经使用过这些。我遇到的问题是,要想进入某些页面,我必须解决很多身份验证问题。@Joshua,你有什么身份验证问题?也许他们会提出一个很好的后续问题。这是一种可能性,这也是我最终想处理这个问题的方式,但有人能回答我的问题只是为了满足我的好奇心吗?ActiveX控件是否有自己的线程?readystate没有更改有什么原因吗?该事件不会触发。这就是问题所在。上面的人可能是对的——无论如何,不应该真的需要使用WebBrowser。它在服务中无法正常工作,并且可能比您所做的任何事情所需的重量都要大。当我开始这么做的时候,我不知道还有什么更好的。