2010-09-02 55 views

回答

6

对,这可能不会起作用。 WebBrowser控件旨在被单个STA线程使用。它不会很好地映射到Web服务中的MTA,并且可能需要一些主要的骇客。

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


编辑

好吧,这可能是可能的,虽然肯定哈克。这里有一个理论实现:

  1. 分离一个STA线程,让Web服务线程等待它。
  2. 在STA线程中加载浏览器。
  3. 导航到所需的网页。导航完成时,请截取屏幕截图。
  4. 将屏幕截图发送回Web服务线程。

的代码会是这个样子:

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不浏览,除非它的加入问题到视觉父母,例如表单。你的旅费可能会改变。祝你好运!

+0

我想要做的是让WCF服务呈现一个html页面并抓取一个快照并将其保存到磁盘。谢谢。 – 2010-09-02 02:19:08

+0

好的。这是可能的,只是可能会让屁股工作变得有点痛苦。我正在更新我的答案以包含理论实现。 – 2010-09-07 14:11:30

+0

我已经更新了我的答案,包括一个可能的解决方案,尽管它是骇人听闻的。 – 2010-09-07 14:28:47