在WCF服务中使用System.Windows.Forms.WebBrowser控件需要做什么?

时间:2010-09-02 01:49:49

标签: c# wcf browser

我相信WebBrowser控件是STA,NT服务中托管的WCF服务是MTA吗? 感谢。

1 个答案:

答案 0 :(得分:6)

是的,这可能行不通。 WebBrowser控件旨在由单个STA线程使用。它不能很好地映射到Web服务中的MTA,并且可能需要一些主要的hackery。

你想做什么?如果您可以描述您的问题,我们可能会提出替代解决方案。


修改

好的,这可能是可能的,虽然肯定是hacky。这是一个理论实现:

  1. 启动STA线程,让Web服务线程等待它。
  2. 在STA线程中加载浏览器。
  3. 导航到所需的网页。导航完成后,请截取屏幕截图。
  4. 将屏幕截图发送回网络服务主题。
  5. 代码看起来像这样:

    public Bitmap GiveMeScreenshot()
    {
        var waiter = new ManualResetEvent();
        Bitmap screenshot = null;
    
        // Spin up an STA thread to do the web browser work:
        var staThread = new Thread(() =>
        {
            var browser = new WebBrowser();
            browser.DocumentCompleted += (sender, e) => 
            {
                screenshot = TakeScreenshotOfLoadedWebpage(browser);
                waiter.Set(); // Signal the web service thread we're done.
            }
            browser.Navigate("http://www.google.com");
        };
        staThread.SetApartmentState(ApartmentState.STA);
        staThread.Start();
    
        var timeout = TimeSpan.FromSeconds(30);
        waiter.WaitOne(timeout); // Wait for the STA thread to finish.
        return screenshot;
    };
    
    private Bitmap TakeScreenshotOfLoadedWebpage(WebBrowser browser)
    {
        // TakeScreenshot() doesn't exist. But you can do this using the DrawToDC method:
        // http://msdn.microsoft.com/en-us/library/aa752273(VS.85).aspx
        return browser.TakeScreenshot(); 
    }
    

    此外,根据过去的经验记录:我们已经看到System.Windows.Forms.WebBrowser不会导航的问题,除非它被添加到可视父级,例如表单。你的旅费可能会改变。祝你好运!