【问题标题】:Use webBrowser control in aspx website在 aspx 网站中使用 webBrowser 控件
【发布时间】:2014-08-11 08:39:12
【问题描述】:

我正在使用下面的代码在一个aspx网站中使用一个webBrowser控件作为一个类-

public CustomBrowser()
{
    //
    // TODO: Add constructor logic here
    //
}

protected string _url;
string html = "";
public string GetWebpage(string url)
{
    _url = url;
    // WebBrowser is an ActiveX control that must be run in a
    // single-threaded apartment so create a thread to create the
    // control and generate the thumbnail
    Thread thread = new Thread(new ThreadStart(GetWebPageWorker));
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
    string s = html;
    return s;
}

protected void GetWebPageWorker()
{
    using (WebBrowser browser = new WebBrowser())
    {
        //  browser.ClientSize = new Size(_width, _height);
        browser.ScrollBarsEnabled = false;
        browser.ScriptErrorsSuppressed = true;
        browser.Navigate(_url);
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
        // Wait for control to load page
        while (browser.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();

        html = browser.DocumentText;

    }
}

这很好用,但是我希望将其他方法添加到使用相同 WebBrowser 对象的类中,因此添加类似 -

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

            if (browser.Document.Body.InnerHtml != null)
            {


                 browse();

            }

    }

private void browse(object sender, EventArgs e)
    {

            browser.Navigate("url");


    }

但是我无法访问 WebBrowser 对象,因为它不是全局对象,而且如果我将其设置为全局 aspx 不允许,这可能吗?

【问题讨论】:

    标签: c# asp.net browser


    【解决方案1】:

    您无需将其设为全局。您可以像这样在 CustomBrowser 类中定义 WebBrowser 的私有实例:

    private WebBrowser _browser;
    public CustomBrowser()
    {
        _browser = new WebBrowser();
    }
    

    这样,您的新方法可以访问 WebBrowser 的同一实例,即_browser。您的 CustomBrowser 类需要实现 IDisposable 接口,因为 WebBrowser 是一次性对象。例如:

    public void Dispose()
    {
        if (_browser != null)
        {
            _browser.Stop();
    
            if (!_browser.IsDisposed)
            {
                _browser.Dispose();
            }
        }
    }
    

    实现IDisposable的参考

    【讨论】:

    • 这表示 - ActiveX 控件 '8856f961-340a-11d0-a96b-00c04fd705a2' 无法实例化,因为当前线程不在单线程单元中。因此,为什么我无法使用全球网络浏览器。有什么想法吗?
    • WebBrowser 控件需要在单线程上运行,而您遇到的问题是因为您在多线程环境下运行它。此链接可能对您有用:stackoverflow.com/questions/1418466/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多